spring MVC 404 처리 방법?

프로그래밍|2013. 2. 26. 11:09

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

댓글()
  1. Favicon of https://ykkim.tistory.com BlogIcon 영기교주 2014.11.14 11:00 신고 댓글주소  수정/삭제  댓글쓰기

    안녕하세요.
    Filter를 사용하여 404 처리가 가능하네요.
    Filter를 사용하므로서 none파일에 대한 URL도 구할 수 있습니다

    참고할 곳
    http://www.theserverside.com/news/thread.tss?thread_id=29287

    좋은 하루되세요.

  2. ㅇㅇ 2020.10.26 17:59 댓글주소  수정/삭제  댓글쓰기

    광고를 코드위에다가 올리는 사람은 처음보네요.

    • Favicon of https://lng1982.tistory.com BlogIcon 목표를 위해 2020.11.03 23:00 신고 댓글주소  수정/삭제

      애드센스 광고가 노출되고 있긴 한데 광고가 코드 위에 올라가는 지는 몰랐네요.
      저는 한번도 겪어보지 못했던 터라..
      불편하셨다면 사과드립니다.