>source

@ControllerAdvice 및 @ExceptionHandler에 대한 일반적인 질문이 있습니다. 2 개의 API가있는 @RestController 주석이 달린 나머지 컨트롤러가 있습니다. 인수 유효성 검사가 실패하면 MethodArgumentNotValidException . 이를 처리하기 위해 ExceptionHandler를 만들었습니다.

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(value = {MethodArgumentNotValidException.class})
    public ResponseEntity<String> handleException(MethodArgumentNotValidException e) throws Exception {
        return new ResponseEntity<>(e.getBindingResult().getGlobalError().getDefaultMessage(), HttpStatus.BAD_REQUEST);
    }
}

이 예외가 발생할 때 무언가를 기록하고 싶다면 전에 코드 줄을 추가 할 수 있습니까? return 다음과 같은 진술 :

LOG.info("something happened");

기록한 다음 BAD_REQUEST를 호출자에게 반환합니까?


  • 답변 # 1

    If I want to log something when this exception happens, can I just add line of code before return statement like:

    LOG.info("something happened");

    Will it log it and then return BAD_REQUEST back to the caller?

    예. 그것이 사용의 목적입니다 @ExceptionHandler 에스. 프로젝트에 정의 된 여러 나머지 끝점에서 예외를 처리하는 코드를 줄이는 데 도움이됩니다. 이것은 또한 예외를 기록하는 단일 지점 역할을하므로이 안티 패턴을 방지합니다.

    //BAD
    class SomeService {
        public SomeEntity someMethod() {
            try {
                /* stuff... */
            } catch (Exception e) {
                //No need to log the exception here
                log.error("An exception happened", e);
                throw e;
            }
        }
    }
    
    

    그래도 예외를 래핑하고 다시 던지는 것과 같은 몇 가지 이점을 얻을 수 있습니다.

    //GOOD
    class SomeService {
        public SomeEntity someMethod(String param) {
            try {
                /* stuff... */
            } catch (Exception e) {
                //You may use this to perform other logic like setting specific message or wrap your exception
                log.error("Unexpected behaviour with param {}", param);
                throw new MyCustomException("Some message", e);
            }
        }
    }
    
    

    당신은 생각할 수 있습니다 @ExceptionHandler 거인으로서 catch 모든 나머지 엔드 포인트 및 특정 유형의 예외에 대해 차단합니다.

    게다가, 당신의 GlobalExceptionHandler 클래스는 백엔드에서 발생하는 모든 예외를 처리하기위한 로직이 연결된 구성 요소가되고이를 클라이언트 측에보고하는 방법을 처리합니다.

관련 자료

  • 이전 java - 동적보기의 이미지가 표시되지 않습니다
  • 다음 PowerShell에서 사용자 지정 형식으로 데이터를 CSV 파일로 내보내기