ExceptionResolver의 우선순위가 왜 ExceptionHandlerExceptionReosolver, ResponseStatusExceptionResolver, DefaultHandlerExceptionResolver의 순서로 되어잇는지 코드를 확인해봤습니다.
ExceptionResolver의 우선 순위를 확인할 수 있는 코드는 아래와 같습니다. WebMvcConfigurationSupport 클래스에 addDefaultHandlerExceptionResolvers 메소드는 아래처럼 정의되어 있습니다.
protected final void addDefaultHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers,
ContentNegotiationManager mvcContentNegotiationManager) {
ExceptionHandlerExceptionResolver exceptionHandlerResolver = createExceptionHandlerExceptionResolver();
exceptionHandlerResolver.setContentNegotiationManager(mvcContentNegotiationManager);
exceptionHandlerResolver.setMessageConverters(getMessageConverters());
exceptionHandlerResolver.setCustomArgumentResolvers(getArgumentResolvers());
exceptionHandlerResolver.setCustomReturnValueHandlers(getReturnValueHandlers());
if (jackson2Present) {
exceptionHandlerResolver.setResponseBodyAdvice(
Collections.singletonList(new JsonViewResponseBodyAdvice()));
}
if (this.applicationContext != null) {
exceptionHandlerResolver.setApplicationContext(this.applicationContext);
}
exceptionHandlerResolver.afterPropertiesSet();
exceptionResolvers.add(exceptionHandlerResolver);
ResponseStatusExceptionResolver responseStatusResolver = new ResponseStatusExceptionResolver();
responseStatusResolver.setMessageSource(this.applicationContext);
exceptionResolvers.add(responseStatusResolver);
exceptionResolvers.add(new DefaultHandlerExceptionResolver());
}
위의 빨간색으로 표시한 순서대로 List에 add를 하고,
나중에 DispatcherServlet의 processExceptionHandler 메소드에서 List를 순회하기 때문에 이 우선순위대로 동작한다고 이해하시면 좋을 것 같습니다.
당연히 많이들 아시는 내용이고 간단한 내용이라 글 쓰는게 맞나. 부담스러운 부분도 있지만, 저처럼 모르시는 분들을 위해 글써봤습니다.
명아주님 공유 감사합니다^^
답글