@ControllerAdvice 어노테이션을 사용해서
모든 @Controller에서 발생한 예외를 잡아 처리해보겠습니다.
@ControllerAdvice 생성하기
1. 새로운 클래스를 만들어서 어노테이션을 붙입니다.
2. @ExceptionHandler로 처리하고 싶은 예외 별로 처리하면 됩니다.
@ControllerAdvice
public class ExceptionAdvice {
@ExceptionHandler(NullPointerException.class)
public ModelAndView nullPointerException() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("error/null_error");
modelAndView.addObject("exception", ex);
return modelAndView;
}
@ExceptionHanlder(Exception.class)
public String Exception() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("error/common_error");
modelAndView.addObject("exception", ex);
return modelAndView;
}
}
ExceptionAdvice라는 클래스를 만들어서 Exception 별로 뷰를 리턴하도록 처리했습니다.
NullPointerException이 발생한 경우에는 /WEB-INF/views/error/null_error.jsp로 연결됩니다.
그 외 Exception이 발생한 경우에는 /WEB-INF/views/error/common_error.jsp로 연결됩니다.
원하는 Exception 별로 처리를 구분하여 진행할 수 있습니다.
예제 코드는 뷰를 연결하는 것으로 끝냈지만, ExceptionHandler 내에서 로그를 쌓는다던지
원하는 작업을 하시면 되겠습니다.
정상 작동하지 않는다면?
정상 작동하지 않는 경우 다음과 같은 내용을 살펴봐야 합니다.
1. @ControllerAdvice 어노테이션이 import 되지 않는다면?
--> 해당 어노테이션은 Spring 3.2 버전 이상에 추가된 기능입니다. 버전을 확인해주세요
2. Exception이 발생해도 해당 @ControllerAdvice > ExceptionHandelr로 연결되지 않아요
--> DispatcherServlet에서 Component-scan의 base-package 설정을 확인해주세요
새로 만드신 Class가 해당 Package에 포함되지 않는 경우 어노테이션 적용되지 않습니다.
(제가 겪은 내용입니다, 놓치기 쉬운 내용이고 놓치면 찾기 쉽지 않습니다...)
*DispatcherSerlvet 설정 XML 파일에 아래 코드 확인
<context:component-scan base-package="com.springweb.*" />