500 메세지는 문법 오류 발생시 @ExceptionHandler를 이용해서 처리가 가능하지만,
404 메세지는 오류가 아닌 URL, URI를 잘못 호출했을 때 처리해야 한다. 따라서 서블릿이
web.xml에 간 후 어디로 가야할 지 모를 때 NoHandlerFoundException을 발생시키도록
설정을 해놓고, 실제로 매핑을 못 찾았을 때 그 예외가 발생되고, 예외 발생시
CommonExceptionAdvice 객체가 잡아준다. 따라서 404 메세지 대신에 원하는 페이지로
응답할 수 있게 된다.
따라서 web.xml에 404 에러 페이지로 넘기지 않고 Exception을 발생시키는 설정을 해주어야한다<init-param> <param-name>throwExceptionIfNoHandlerFound</param-name> <param-value>true</param-value> </init-param>
테스트
NoHandlerFoundException이 발생하면 error_404.jsp로 이동하게 하는 메소드를 만든다.
즉, 404에러가 났을때 404 메세지 대신 error_404.jsp로 이동하게 된다.@ControllerAdvice @Log4j public class CommonExceptionAdvice { @ExceptionHandler(NoHandlerFoundException.class) @ResponseStatus(HttpStatus.NOT_FOUND) public String handle404(NoHandlerFoundException nfe) { return "error_404"; } }
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h2>해당 URL은 존재하지 않습니다.</h2> <a href="/ex01">메인으로 돌아가기</a> </body> </html>
이제 따로 매핑해두지 않은 url주소를 입력하고 실행해본다면
우리가 만들어둔 페이지가 잘 나오는 것을 확인할 수 있다.