Exception를 받아주는 컨트롤러 catcher메서드를 만들었다. 이를 통해 main메서드와 main2메서드의 중복코드가 해소되었다. 또한 컨트롤러 catcher메서드와 catcher2메소드를 Exception별로 나누었다. catcher메서드는 Exception를 받고 catcher2메소드는 NullPointerException만 받게 된다. 이를 통해 특정Exception에 맞게 예외를 처리해줄 수 있다.
@ControllerAdvice publicclassCommonExceptionAdvice{ privatestaticfinal Logger l = LoggerFactory.getLogger(CommonExceptionAdvice.class); // @ExceptionHandler(Exception.class) // public String common(Exception e, Model model) { // model.addAttribute("e", e); // Model객체 지원x기에 ModelAndView 객체를 사용 // return "common_error"; // }
@ExceptionHandler(Exception.class) privateModelAndViewerrorModelAndView(Exceptione) { ModelAndView mav = new ModelAndView(); mav.setViewName("common_error"); mav.addObject("e", e); return mav; } //@ExceptionHandler(MethodArgumentTypeMismatchException.class) public String commonMismatch(Exception e){ return"common_error"; //출력값 //INFO : com.itwiilbs.controller.CommonExceptionAdvice - E: commonMismatch(e) 호출 org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'int'; nested exception is java.lang.NumberFormatException: For input string: "" //E: commonMismatch 호출org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'int'; nested exception is java.lang.NumberFormatException: For input string: ""
} }
CommonExceptionAdvice 객체에서는 Model객체를 파라미터로 사용하는것을 지원하지 않기때문에 ModelAndView 객체를 사용해야한다.
common_error.jsp 페이지 생성
error.jsp는 어떻게 표현하면 좋을까? 보통 “관리자에게 문의하세요”라는 문구가 사용자에게 보여진다. 가장 간단한 형태로 만들어보면 아래와 같다. isErrorPage=”true”이면 항상 500에러가 나타나므로 isErrorPage=”false”로 설정해줘야한다.
위 CommonExceptionAdvice.java 코드를 보면 return값으로 특정 jsp 페이지(common_error.jsp)를 호출하고 있다. 해당 컨트롤러에서 처리하지 못한 error들은 어떻게 될까? 톰캣에서 기본적으로 제공하는 error 페이지를 호출된다. 톰캣에서 제공하는 에러페이지는 예쁘지도않고 사용자친화적이지도 않다. 이때 커스텀한 에러 페이지를 사용하게 되는데 서버에서 주는 상태코드별로 디폴트페이지를 web.xml에서 지정해줄 수 있다. 자주 처리하는 HTTP 상태코드는 400,401,403,404,500이다.
예외종류별로 error를 보여주고 싶을때는 어떻게 할까? SimpleMappingExceptionResolver를 사용하면 된다. sevlet-cntext.xml 파일에 예외종류에 맞는 에러뷰를 등록할 수 있다. MyErrorPage에 대한 상태코드를 원하는 대로(아래 예제에선 404) 지정할 수 있다.