[Spring] 예외 처리
스프링 예외처리
@ControllerAdvice
@ControllerAdvice
@Log4j2
public class CommonExceptionAdvice {
@ResponseBody
@ExceptionHandler(NumberFormatException.class)
public String exceptNumber(NumberFormatException numberFormatException) {
log.error("Number------------------------------");
log.error(numberFormatException.getMessage());
return "NUMBER FORMAT EXCEPTION";
}
@ResponseBody
@ExceptionHandler(Exception.class)
public String exceptCommon(Exception exception) {
log.error("common------------------------------");
log.error(exception.getMessage());
StringBuffer buffer = new StringBuffer("<ul");
buffer.append("<li>" + exception.getMessage()+"</li>");
Arrays.stream(exception.getStackTrace()).forEach(stackTraceElement -> {
buffer.append("<li>" + stackTraceElement+"</li>");
});
buffer.append("</ul>");
return buffer.toString();
}
@ExceptionHandler(NoHandlerFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public String notFound() {
return "custom404";
}
}
- BindException 처리
- Controller 파라미터에 @Valid 이 있을경우 BindException 을 throw 함
- @ControllerAdvice 에서 BindException 을 처리
@PostMapping(value = "/", consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Map<String,Long>> register(@Valid @RequestBody ReplyDTO replyDTO, BindingResult bindingResult)
throws BindException {
if(bindingResult.hasErrors()){
throw new BindException(bindingResult);
}
log.info(replyDTO);
Map<String, Long> resultMap = Map.of("rno", 111L);
return ResponseEntity.ok(resultMap);
}
@RestControllerAdvice
@Log4j2
public class CustomRestAdvice {
@ExceptionHandler(BindException.class)
@ResponseStatus(HttpStatus.EXPECTATION_FAILED)
public ResponseEntity<Map<String, String>> handleBindException(BindException e) {
log.error(e);
Map<String, String> errorMap = new HashMap<>();
if(e.hasErrors()){
BindingResult bindingResult = e.getBindingResult();
bindingResult.getFieldErrors().forEach(fieldError -> {
errorMap.put(fieldError.getField(), fieldError.getCode());
});
}
return ResponseEntity.badRequest().body(errorMap);
}
}