[스프링부트] Spring Boot Exception(예외처리)

Harry park·2021년 12월 28일
0

SpringBoot

목록 보기
6/11
post-thumbnail

스프링부트 예외처리(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("");
}

}

profile
Jr. Backend Engineer

0개의 댓글