에러 발생시 가장 우선순위가 높은 경로이며 만약 해당 경로에 view 파일이 없을시에는 정적리소스(static,public), 또는 error.html 파일을 찾는다.
스프링 Rest Controller 오류 처리
@ExceptionHandler
Controller 내 메소드로 정의도며 해당 Controller에서 발생하는 에러를 받아 처리한다.
@RestController
public class ExceptionTestController {
@ExceptionHandler
public Object handlerException(Exception e) {
System.out.println("ExceptionTestController.handlerException");
return "error";
}
// HandlerExceptionResolver에 의해 등록한 형태로 매핑하여 처리
@ExceptionHandler(value = {IOException.class, FileNotFoundException.class})
public Object notFoundHandler(Exception e) {
return "notfound";
}
@ExceptionHandler(value = TimeoutException.class)
public Object timeoutExceptionHandler(Exception e) {
System.out.println("ExceptionTestController.timeoutExceptionHandler");
return "error";
}
}
value 값 지정을 통해 특정 예외를 지정할 수 도 있다. 해당 컨트롤러안에서의 예외만을 처리한다.
@ControllerAdvice
모든 Controller에서 발생할 수 있는 예외를 잡아 처리한다. DispatcherServlet에서 실행하다가 에러가 발생하면 handlerExceptionResolvers가 실행되는 구조이다.
@RestControllerAdvice
public class GlobalExceptionHandler {
//@ControllerAdvice로 정의된 빈이 주입된 handlerExceptionResolvers가 실행되는 구조입니다.
@ExceptionHandler(java.lang.IllegalArgumentException.class)
public ResponseEntity IllegalArgumentException(IllegalArgumentException illegalArgumentException) {
return new ResponseEntity(HttpStatus.OK);
}
}
사용자 설정 Exception
상위 Exception을 상속받는 형식으로 사용하면 된다.
public class NoDeliveryException extends DataAccessException {
public NoDeliveryException(String msg) {
super(msg);
}
public NoDeliveryException(String msg, Throwable cause) {
super(msg, cause);
}
}
Controller
@Controller
@RequestMapping("/exception")
public class ExceptionViewController {
@ExceptionHandler(NoDeliveryException.class)
public String noDelivery(NoDeliveryException e, Model model) {
model.addAttribute("exception", e);
return "deliver";
}
@GetMapping("/deliver")
public String exceptionTest() {
throw new NoDeliveryException("티켓 모두 소진됨");
}
}