springframework

WAS 가 던지는 에러페이지 핸들링.

Jungsoomin :) 2020. 8. 9. 19:55

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";
	}