1. 각각의 Controller 내에 예외 처리하는 메서드 생성
1. 형식
@ExceptionHandler(예외발생객체명.class)
public ModelandView ex1(){}
- 해당 Controller내에서 발생한 예외만 처리
- 다른 Controller에서 발생한 예외는 처리하지 않음
- 각각의 Controller에서 각각 메서드 생성
//예외처리 메서드 ++++++++++++++++++++++++++++
@ExceptionHandler(BindException.class)
public ModelAndView ex1() {
ModelAndView mv = new ModelAndView();
System.out.println("예외 발생 처리");
mv.setViewName("error/error");
return mv;
}
@ExceptionHandler(NullPointerException.class)
public ModelAndView ex2() {
ModelAndView mv = new ModelAndView();
System.out.println("Nullpointer 예외 발생 처리");
mv.setViewName("error/error");
return mv;
}
@ExceptionHandler(Exception.class)
public ModelAndView ex3() {
ModelAndView mv = new ModelAndView();
System.out.println("Exception 예외 발생 처리");
mv.setViewName("error/error");
return mv;
}
@ExceptionHandler(Throwable.class)
public ModelAndView ex4() {
ModelAndView mv = new ModelAndView();
System.out.println("Exception 예외 발생 처리");
mv.setViewName("error/error");
return mv;
}
2. 예외를 전역 처리
- 예외를 전문적으로 처리하는 Controller 생성
1. 예외를 처리할 전문 Controller용 클래스 생성
2. @Controller 이 아닌 @ControllerAdvice 선언
3. 예외를 처리할 예외메서드 선언
@ControllerAdvice
public class ExceptionController {
@ExceptionHandler(BindException.class)
public ModelAndView ex1(Exception e) {
ModelAndView mv = new ModelAndView();
System.out.println(e.getMessage());
System.out.println("========================");
e.printStackTrace();
System.out.println("예외 발생 처리");
mv.addObject("msg", "불편을 죄송!");
mv.addObject("path", "../");
mv.setViewName("common/getResult");
return mv;
}
@ExceptionHandler(NullPointerException.class)
public ModelAndView ex2(NullpointerException ex) {
ModelAndView mv = new ModelAndView();
System.out.println("Nullpointer 예외 발생 처리");
mv.setViewName("error/error");
return mv;
}
@ExceptionHandler(Exception.class)
public ModelAndView ex3(Exception ex) {
ModelAndView mv = new ModelAndView();
System.out.println("Exception 예외 발생 처리");
mv.setViewName("error/error");
return mv;
}
@ExceptionHandler(Throwable.class)
public ModelAndView ex4() {
ModelAndView mv = new ModelAndView();
System.out.println("Exception 예외 발생 처리");
mv.setViewName("error/error");
return mv;
}
}
3. Front Error 처리
Exception는 서버오류 (500번대) 이므로 ExceptionHandler에서 처리 가능
Front 오류는(400번대) 문법오류가 아니고, URL주소나 method 형식이 다른 경우 발생.
1. application.properties에 작성
spring.mvc.throw-exception-if-no-handler-found=true
spring.web.resources.add-mappings=false
2. ExeptionHandler Method 선언
//400 : 파라미터가 잘못된 경우
HttpMessageNotReadableException
//401 : 인증 실패
AuthenticationException
//403 : 권한 실패
AcessDeniedException
//405 : Method 형식 실패
HttpRequestMethodNotFoundException
//404
@ExceptionHandler(NoHandlerFoundException.class)
public ModelAndView ex5() {
ModelAndView mv = new ModelAndView();
System.out.println("4XX 예외 발생 처리");
mv.addObject("message", "Page를 찾을 수 없습니다");
mv.setViewName("error/error");
return mv;
}