스프링에서는 예외 발생 시 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>
'프로그래밍' 카테고리의 다른 글
enum 으로 생성한 클래스 객체가 싱글톤인 이유? (0) | 2013.03.05 |
---|---|
스프링 트래잭션 롤백이 되지 않을 때 확인 사항 (2) | 2013.03.05 |
스프링 interceptor afterCompletion 메소드 이용 시 참고할 사항 (0) | 2013.02.26 |
스프링 CGLib 클래스 프록시 사용 (0) | 2013.02.26 |
개방 폐쇄 원칙 OCP (Open-Closed Principle) (2) | 2013.02.26 |
singleton VS prototype 객체 성능 비교 (0) | 2013.02.21 |
리눅스에서 java main 실행 (0) | 2013.02.14 |
ajax HTTP, HTTPS에 따른 크로스 도메인 문제 (2) | 2013.02.05 |