springframe work 에서 Server 에러는 @ExceptionHandler로 컨트롤할 수 있으나, WAS 내부에서 뿌려지는 에러에 대해서는 따로 설정이 필요하다.
첫 시도는 이거였다..Web.xml에 디스패쳐 서블릿 설정에서 해당 파라미터를 true 로 주고 @ExceptionHandler 에서 NoHandlerFoundException.class 를 잡아 사용하려고 했던 것이다. 하지만 아무리 경로를 다르게 주어도 작동하지 않았다.
그렇게 삽질이 시작됬다.
<init-param>
<param-name>throwExceptionIfNoHandlerFound</param-name>
<param-value>true</param-value>
</init-param>
stackoverflow를 찾아 본 결과(내가 이걸 읽고 있을 줄이야, 공시 공부가 도움이...많이 됬다.)
해석하며 따라가본 결과, RequestMappingHandlerMapping 객체는 @RequestMapping 이나 @GetMapping 등의 어노테이션으로 잡아서 찾아내는데, ...
NoHandlerFoundException will never be thrown if DefaultServletHttpRequestHandler is used. 라고 하신다.
DefaultServletHttpRequestHandler 에 대한 내용은 따로 글로 빼겠다.
여튼, 이런 저런 방법을 시도했다. @RequestMapping 메서드에 경로로 /**(Ant패턴.) 을 주어서 잡아보게 해서 NoHandlerFoundException을 throw 시키기도 해보고...., 그러나 날라오는 것은 TypeMisMatchException... ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ
여튼...그렇게 삽질을 하다가 Servlet 기반 에러페이지 처리까지 갔다. 보아하니, Web.xml에 <error-page> 태그를 주어 에러페이지를 지정하는 것처럼 보여 시도했다.
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/views/custom404.jsp</location>
</error-page>
가능했다. 무사히 에러페이지가 출력됬으나, ..개인적으로 마음에 차지는 않는 듯 하다... NoHandlerFoundException을 사용하는 의미가 사라졌으니까..
일단, 이렇게 마무리 지었다.
NoHandlerFoundException을 캐치하기 위해서 작성한 컨트롤러 코드......더 알아봐야겠다.
@ExceptionHandler(NoHandlerFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public String handle404(NoHandlerFoundException ex) {
return "custom404";
}
'springframework' 카테고리의 다른 글
DefaultHandler 와 우선순위. (0) | 2020.08.09 |
---|---|
JavaConfig 에 대한 WAS Exception Handling (0) | 2020.08.09 |
Spring Legacy Project 서블릿 스펙 3.1로 업그레이드. (0) | 2020.08.09 |
@Log4j 에노테이션 적용이 안될때... (0) | 2020.08.02 |
paging 기법. (0) | 2020.07.29 |