@RestControllerAdvice 및 @ExceptionHandler 메모 원본 상세 정보
2494 단어 스프링 소스
1. 프로세스
@RestControllerAdvice와 @ExceptionHandler 메모는 sprngmvc에서 이상 포착 및 처리와 관련된 메모이며, 입구도 DispatcherServlet의 doDispatcher() 방법입니다.
this.processDispatchResult(processedRequest, response, mappedHandler, mv, (Exception)dispatchException);
뒤에 Handler Exception Resolver Composite의 Resolve Exception 방법이 들어갑니다. 이 Exception Handler Resolver Composite는 세 개의 Excpetion Handler Resolver를 포함하고 스프링mvc에서 생성된 것으로 스프링부트에서 생성된 코드는 다음과 같습니다.
@Bean
public HandlerExceptionResolver handlerExceptionResolver() {
List exceptionResolvers = new ArrayList<>();
configureHandlerExceptionResolvers(exceptionResolvers);
if (exceptionResolvers.isEmpty()) {
addDefaultHandlerExceptionResolvers(exceptionResolvers);
}
extendHandlerExceptionResolvers(exceptionResolvers);
HandlerExceptionResolverComposite composite = new HandlerExceptionResolverComposite();
composite.setOrder(0);
composite.setExceptionResolvers(exceptionResolvers);
return composite;
}
뒤에 ExceptionHandlerExceptionResolver 클래스에 들어가는 방법:
protected ModelAndView doResolveHandlerMethodException(HttpServletRequest request,
HttpServletResponse response, @Nullable HandlerMethod handlerMethod, Exception exception) {
ServletInvocableHandlerMethod exceptionHandlerMethod = getExceptionHandlerMethod(handlerMethod, exception);
이 방법의 첫 줄,
getexceptionHandlerMethod 방법은 @ControllerAdvice 주석이 있는 유형과 일치하는 방법을 찾아서doResolverHandlerMethod 방법에서 처리했습니다. 이것이 전체 절차입니다. 그러면 우리는 현재 프로세스 분석을 마쳤습니다. 다음은 @ControllerAdvice라는 bean이 언제 어디에서spring에 가입되었는지 확인하고 두 번째 분석을 진행합니다.
2. bean 불러오기 분석
먼저 springboot 스캔을 할 때 @ControllerAdvice의 bean을 beanFactory에 넣습니다. 이때 beanFactory에서 필요한 bean을 가져오면 됩니다. 처리 방식은 ExceptionHandlerExceptionResolver 클래스에 있습니다.
@Override
public void afterPropertiesSet() {
// Do this first, it may add ResponseBodyAdvice beans
initExceptionHandlerAdviceCache();
private void initExceptionHandlerAdviceCache() {
if (getApplicationContext() == null) {
return;
}
if (logger.isDebugEnabled()) {
logger.debug("Looking for exception mappings: " + getApplicationContext());
}
List adviceBeans = ControllerAdviceBean.findAnnotatedBeans(getApplicationContext());
봉인된 후 @Exceptionhandler가 있는 주석 방법을 가져옵니다. 이상 형식에 따라 호출됩니다.