-
예외 처리 핸들러: @ExceptionHandlerSPRING/스프링 MVC 2021. 7. 13. 00:43
특정 예외가 발생한 요청을 처리하는 핸들러 정의
- 지원하는 메소드 아규먼트 (해당 예외 객체, 핸들러 객체, ...)
- 지원하는 리턴 값
- REST API의 경우 응답 본문에 에러에 대한 정보를 담아주고,
상태 코드를 설정하려면 ResponseEntity를 주로 사용한다.public class EventException extends RuntimeException{ } @Controller @SessionAttributes("event") public class SampleController2 { @ExceptionHandler({EventException.class, RuntimeException.class}) public String eventErrorHandler(EventException exception, Model model) { model.addAttribute("message","event error"); return "error"; } // Exception화면 @GetMapping("/events/exception") public String eventException(Model model) { throw new EventException(); } }
error.html 페이지
<!doctype html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Create New Event</title> </head> <body> <div th:if="${message}"> <h2 th:text="${message}"></h2> </div> </form> </body> </html>
- 컨트롤러에서 @ExceptionHandler를 사용한 메서드를 작성하여, 메서드 파라미터에 원하는 Exception을 넣으면 예외 처리를 핸들링할 수 있다.
- 위 예시의 경우 EventException 파라미터를 통하여 @ExceptionHandler를 호출한다.
- @ExceptionHandler에서는 error.html로 model 정보를 담아서 넘겨준다.
결과
@ExceptionHandler({EventException.class, RuntimeException.class})
-> 위와 같이 어노테이션에 Exception 클래스들을 선언하면 해당 Exception들만 핸들링한다.
@RestController에서 @ExceptionHandler 사용하기
@RestController @RequestMapping("/api/events") public class EventApi { @ExceptionHandler(EventException.class) public ResponseEntity eventErrorHandler(EventException exception, Model model) { return ResponseEntity.badRequest().body("EventExceptin ERROR 발생"); } // 에러 @PostMapping(value = "/error") public Event createEventWithException(HttpEntity<Event> request) { throw new EventException(); } }
'SPRING > 스프링 MVC' 카테고리의 다른 글
전역 컨트롤러: @(Rest)ControllerAdvice (0) 2021.07.13 DataBinder: @InitBinder (0) 2021.07.11 모델: @ModelAttribute 또 다른 사용법 (0) 2021.07.11 핸들러 메소드 16부 - @ResponseBody & ResponseEntity (0) 2021.07.10 핸들러 메소드 15부: @RequestBody & HttpEntity (0) 2021.07.10