카테고리 없음

스프링 예외처리 - part2 (@ExceptionHandler)

designercoding 2021. 5. 9. 18:23

스프링 예외처리 3가지 방식

  • 메서드 단위에서 예외 상황을 예측해서 try/catch를 통해 처리하는 방법.
  • 컨트롤러(@Controller, @RestController가 적용된 Bean내에서 발생하는 예외)에서 @ExceptionHandler를 사용해서 예외처리-Global level(@ControllerAdvice, @RestControllerAdvice)에서 컨트롤러 이후 Client에게 전달되기 직전 처리해서 적용범위를 지정하는 방법
  • 스프링 시큐리티에서 인터셉터로 UnauthorizedException 등으로 예외처리하는 방법

@ExceptionHandler

 

@Controller, @RestController가 적용된 Bean내에서 예외가 발생하면 해당메서드에서 처리를 하는 방식

예외상황 클래스를 삽입

 

해당 컨트롤러의 범위를 지정하는 방식은 2가지

  • 해당 컨트롤러의 클래스에 삽입하면 해당 클래스만 적요
  • 범위를 지정 할 수 있는 클래스를 새로 만들고 @RestControllerAdvice 또는 @ControllerAdvice에서 디폴트지정하면 전역으로 지정 또는 특정클래스를 지정가능

해당 클래스에 직접 삽입 방법

    @PostMapping("")
    public User post(@Valid @RequestBody User user){
        System.out.println(user);
        return user;
    }

    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public ResponseEntity methodArgumentNotValidException(MethodArgumentNotValidException e){
        System.out.println("api controller");
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage());
    }

 

@RestControllerAdvice을 이용 전역으로 지정 - 디폴드 값

@RestControllerAdvice()

 

@RestControllerAdvice을 이용 특정 컨트롤로 지정 - @RestControllerAdvice(basePackageClasses =클래스명.class)

@RestControllerAdvice(basePackageClasses = ApiController.class)

 

@RestControllerAdvice을 이용 특정 컨트롤로 지정 - @RestControllerAdvice(클래스명.class)

@RestControllerAdvice(클래스명.class)

 

예시

@RestControllerAdvice(basePackageClasses = ApiController.class)
public class ApiControllerAdvice {

    @ExceptionHandler(value = Exception.class)
    public ResponseEntity exception(Exception e){
        System.out.println(e.getClass().getName());
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("");
    }

    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public ResponseEntity methodArgumentNotValidException(MethodArgumentNotValidException e, HttpServletRequest httpServletRequest){

        List<Error> errorList = new ArrayList<>();

        BindingResult bindingResult = e.getBindingResult();
        bindingResult.getAllErrors().forEach(error -> {
            FieldError field = (FieldError) error;

            String fieldName = field.getField();
            String message = field.getDefaultMessage();
            String value = field.getRejectedValue().toString();

            Error errorMessage = new Error();
            errorMessage.setField(fieldName);
            errorMessage.setMessage(message);
            errorMessage.setInvalidValue(value);

            errorList.add(errorMessage);
        });

 

예외처리를 하는 목적 중 하나는 오류전달를 통일성과 간편성

- Error와 ErrorResponse로 객체화해 해결

 

반응형