Springboot Exception
1. ExceptionHandler 우선 순위
1) Controller내부 Exception 처리
hello Method에서 [Exception타입] Exception이 발생하면, @ExceptionHandler(value = [Exception타입]) 어노테이션에서 처리한다.
Controller내부의 @ExceptionHandler가 전역 @ExceptionAdvice 보다 우선해서 처리된다.
- Sample Code
public class HelloController {
@GetMapping("/hello")
public void hello() throws Exception {
throw new Exception();
}
@ExceptionHandler(value = Exception.class)
public ResponseEntity<Map<String, String>> ExceptionHandler(Exception e) {
HttpHeaders responseHeaders = new HttpHeaders();
//responseHeaders.add(HttpHeaders.CONTENT_TYPE, "application/json");
HttpStatus httpStatus = HttpStatus.BAD_REQUEST;
log.info(e.getMessage());
log.info("Controller내 ExceptionHandler 호출")
Map<String, String> map = new Hashap();
map.put("error Type", httpStatus.getReasonPhrase());
map.put("code", "400");
map.put("message", "예외 발생");
return new ResponseEntity<>(map, responseHeaders, httpStatus);
}
}
2) 별도 클래스 Exception Handler
@RestControllerAdvice를 별도의 클래스로 정의할 수 있다
- Sample Code
@RestControllerAdvice
public class EventExceptionHandler {
private final Logger log = LoggerFactory.getLogger(ExceptionHandler.class);
@ExceptionHandler(value = Exception.class)
public ResponseEntity<Map<String, String>> ExceptionHandler(Exception e) {
HttpHeaders responseHeaders = new HttpHeaders();
HttpStatus httpStatus = HttpStatus.BAD_REQUEST;
log.info(e.getMessage());
log.info("Advice내 ExceptionHandler 호출")
Map<String, String> map = new Hashap();
map.put("error Type", httpStatus.getReasonPhrase());
map.put("code", "400");
map.put("message", "예외 발생");
return new ResponseEntity<>(map, responseHeaders, httpStatus);
}
}
2. Advice
1) @ControllerAdvice, @RestControllerAdvice
- 발생하는 예외를 한곳에서 관리하고 처리할 수 있게 하는 어노테이션
- 설정을 통해 범위 지정 가능
// 예외발생 시 json형태로 결과를 반환한다
@RestControllerAdvice(basePackages = "me.kalpha.event")