카테고리 없음
스프링 예외처리 - 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로 객체화해 해결
반응형