spring MVC 404 처리 방법?

스프링에서는 예외 발생 시 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>