반응형
@Slf4j
@RestControllerAdvice
@Order(1)
public class ControllerExceptionHandler {
@ExceptionHandler({BizRuntimeException.class})
@ResponseBody
public ResponseEntity<ResponseMessage> handleException(BizRuntimeException e) {
log.error("BizRuntime Error Code : " + e.getErrorCode(), e);
return new ResponseEntity<ResponseMessage>(ResponseMessage.builder()
.resultCode(e.getErrorCode())
.resultMessage(e.getErrorMessage())
.detailMessage(e.getMessage())
.build(), HttpStatus.NOT_ACCEPTABLE);
}
@ExceptionHandler({StatusRuntimeException.class})
@ResponseBody
public ResponseEntity<ResponseMessage> handleException(StatusRuntimeException e) {
log.error("StatusRuntime Error Code : " + ResponseEnum.gRpcCallError.getCode(), e);
return new ResponseEntity<ResponseMessage>(ResponseMessage.builder()
.resultCode(ResponseEnum.gRpcCallError.getCode())
.resultMessage(ResponseEnum.gRpcCallError.getDesc())
.detailMessage(e.getMessage())
.build(), HttpStatus.NOT_ACCEPTABLE);
}
@ExceptionHandler({Exception.class})
public ResponseEntity<ResponseMessage> handlException(Exception e) {
log.error("Exception Error Code : " + ResponseEnum.InternalError.getCode(), e);
return new ResponseEntity<ResponseMessage>(ResponseMessage.builder()
.resultCode(ResponseEnum.InternalError.getCode())
.resultMessage(ResponseEnum.InternalError.getDesc())
.detailMessage(e.getMessage())
.build(), HttpStatus.INTERNAL_SERVER_ERROR);
}
@ExceptionHandler({MethodArgumentNotValidException.class})
@ResponseBody
public ResponseEntity<Map<String, String>> MethodArgumentNotValidException(MethodArgumentNotValidException ex){
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getAllErrors()
.forEach(c -> errors.put("resultMessage", c.getDefaultMessage()));
return ResponseEntity.badRequest().body(errors);
}
}
MethodArgumentNotValidException 다른 라이브러리에서 선언시에 해당 클래스 미동작을 하여 클래스 상단에 @Order(1) 어노테이션 선언을 하면 해당 클래스가 우선권을 가진다.
반응형