스프링부트 예외처리(Spring Boot Exception)
Exception 처리
1) 에러 페이지
2) 4XX Error, 5XX Error
3) Client가 200외에 처리를 하지 못 할 때는 200을 내려주고 별도의 에러 Message를 전달[방법]
1) ControllerAdvice
: Global 예외 처리 및 특정 package/Controller 예외 처리
2) ExceptionHandler
: 특정 Controller의 예외 처리//@RestControllerAdvice(basePackages = {"com.example.*"}) @RestControllerAdvice(basePackageClasses = {ExceptionController.class}) public class GlobalControllerAdvice {
@ExceptionHandler(value = {Exception.class})
public ResponseEntity exception(Exception e) {
System.out.println("Exception Caused : " + e.getClass().getName());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("");
}
//org.springframework.web.bind.MethodArgumentNotValidException
@ExceptionHandler(value = {MethodArgumentNotValidException.class})
public ResponseEntity methodArgumentNotValidException(MethodArgumentNotValidException e, HttpServletRequest request) {
List<Error> errorList = new ArrayList<>();
BindingResult bindingResult = e.getBindingResult();
bindingResult.getAllErrors().forEach(objectError -> {
FieldError field = (FieldError) objectError;
String fieldName = field.getField();
String message = field.getDefaultMessage();
String value = field.getRejectedValue().toString();
Error error = new Error();
error.setField(fieldName);
error.setMessage(message);
error.setInvalidValue(value);
errorList.add(error);
});
ErrorResponse errorResponse = new ErrorResponse();
errorResponse.setErrorList(errorList);
errorResponse.setMessage("");
errorResponse.setRequestUrl(request.getRequestURI());
errorResponse.setStatusCode(HttpStatus.BAD_REQUEST.toString());
errorResponse.setResultCode("FAIL");
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorResponse);
}
@ExceptionHandler(value = {ConstraintViolationException.class})
public ResponseEntity constraintViolationException(ConstraintViolationException e, HttpServletRequest request){
List<Error> errorList = new ArrayList<>();
e.getConstraintViolations().forEach(errors -> {
Stream<Path.Node> stream = StreamSupport.stream(errors.getPropertyPath().spliterator(), false);
List<Path.Node> list = stream.collect(Collectors.toList());
String field = list.get(list.size()-1).getName();
String message = errors.getMessage();
String invalidValue = errors.getInvalidValue().toString();
Error error = new Error();
error.setField(field);
error.setMessage(message);
error.setInvalidValue(invalidValue);
errorList.add(error);
});
ErrorResponse errorResponse = new ErrorResponse();
errorResponse.setErrorList(errorList);
errorResponse.setMessage("");
errorResponse.setRequestUrl(request.getRequestURI());
errorResponse.setStatusCode(HttpStatus.BAD_REQUEST.toString());
errorResponse.setResultCode("FAIL");
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorResponse);
}
@ExceptionHandler(value = {MissingServletRequestParameterException.class})
public ResponseEntity missingServletRequestParameterException(MissingServletRequestParameterException e, HttpServletRequest request) {
String fieldName = e.getParameterName();
String fieldMsg = e.getMessage();
List<Error> errorList = new ArrayList<>();
Error error = new Error();
error.setField(fieldName);
error.setMessage(fieldMsg);
errorList.add(error);
ErrorResponse errorResponse = new ErrorResponse();
errorResponse.setErrorList(errorList);
errorResponse.setMessage("");
errorResponse.setRequestUrl(request.getRequestURI());
errorResponse.setStatusCode(HttpStatus.BAD_REQUEST.toString());
errorResponse.setResultCode("FAIL");
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("");
}
}