스프링에서는 예외 발생 시 HandlerExceptionResolver가 예외를 처리하도록 위임할 수 있다.
그래서 난 아래와 같이 SimpleMappingExceptionResolver를 정의한 후 예외 종류에 따라서 사용자에게 보여주는 화면을 달리하였다.
<bean class=”org.springframework.web.servlet.handler.SimpleMappingExceptionResolver”>
<property name=”order” value=”1″ />
<property name=”defaultErrorView” value=”common/error/defaultError” />
<property name=”exceptionMappings”>
<props>
<prop key=”BusinessLogicException”>common/error/businessLogicError</prop>
<prop key=”RuntimeException”>common/error/runtimeError</prop>
<prop key=”TypeMismatchException”>common/error/defaultError</prop>
<prop key=”NoSuchRequestHandlingMethodException”>common/error/defaultError</prop>
</props>
</property>
</bean>
헌데, HTTP 404에 대한 예외 처리는 SimpleMappingExceptionResolver에서 처리를 하지 못한다.
스프링의 @RequestMapping 애노테이션에 정의되지 않은 http://localhost:8080/notFoundRequestMapping 을 호출하게 되면 브라우저에 HTTP status 404를 보여준다.
DispatcherServlet의 doDispatch메소드를 확인해 보니 정의되지 않은 핸들러 메소드를 호출할 때 HandlerExceptionResolver가 처리하는 루틴이 없었다.
정의되지 않은 핸들러 메소드 호출 시 아래 mv 값이 null이 되는데 null인 경우에는 로그만 찍고 끝이다.
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
logger.debug(“Null ModelAndView returned to DispatcherServlet with name ‘” + getServletName() + “‘: assuming HandlerAdapter completed request handling”);
결국 web.xml의 error-page 태그를 이용하기로 했다.
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/view/common/error/404.jsp</location>
</error-page>