@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가 있는 주석 방법을 가져옵니다. 이상 형식에 따라 호출됩니다.

좋은 웹페이지 즐겨찾기