CustomExceptionHandler.java
@RestControllerAdvice
public class CustomExceptionHandler {
private final Logger LOGGER = LoggerFactory.getLogger(CustomExceptionHandler.class);
@ExceptionHandler(value = RuntimeException.class)
public ResponseEntity<Map<String,String>> handleException(RuntimeException e, HttpServletRequest request){
HttpHeaders responseHeaders = new HttpHeaders();
HttpStatus httpStatus = HttpStatus.BAD_REQUEST;
LOGGER.error("Advice 내 handleException 호출, {}, {}",request.getRequestURI(),e.getMessage() );
Map<String,String> map = new HashMap<>();
map.put("error type", httpStatus.getReasonPhrase());
map.put("code","400");
map.put("message",e.getMessage());
return new ResponseEntity<>(map,responseHeaders,httpStatus);
}
}
@ExceptionHandler가 적용된 클래스에 오류가 발생을 알리는 응답 메시지를 구성해서 리턴한다.
ExceptionController.java
@RestController
@RequestMapping("/exception")
public class ExceptionController {
@GetMapping
public void getRuntimeException(){
throw new RuntimeException("getRuntimeException 메서드 호출");
}
}
요청 시 다음과 같이 오류에 대한 메시지를 반환하는 것을 확인할 수 있다.
ExceptionController.java
@RestController
@RequestMapping("/exception")
public class ExceptionController {
private final Logger LOGGER = LoggerFactory.getLogger(ExceptionController.class);
@GetMapping
public void getRuntimeException(){
throw new RuntimeException("getRuntimeException 메서드 호출");
}
@ExceptionHandler(value = RuntimeException.class)
public ResponseEntity<Map<String,String>> handleException(RuntimeException e, HttpServletRequest request){
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.setContentType(MediaType.APPLICATION_JSON);
HttpStatus httpStatus = HttpStatus.BAD_REQUEST;
LOGGER.error("클래스 내 handleException 호출, {}, {}",request.getRequestURI(),e.getMessage() );
Map<String,String> map = new HashMap<>();
map.put("error type", httpStatus.getReasonPhrase());
map.put("code","400");
map.put("message",e.getMessage());
return new ResponseEntity<>(map,responseHeaders,httpStatus);
}
}
Controller 클래스에 @ExcpetionHandler를 선언한 메소드를 작성 후 컨트롤러에 요청할 시 클래스 내 handleException 호출 이라는 메시지가 뜨게 된다.
@ControllerAdvice와 컨트롤러 내에 같은 예외처리를 할 시 우선순위가 높은 클래스 내 핸들러 메서드가 사용되는 것을 확인할 수 있다.