programing

MethodArgumentNotValidException을 올바르게 던지는 방법

elecom 2023. 8. 21. 19:36
반응형

MethodArgumentNotValidException을 올바르게 던지는 방법

컨트롤러에서 @Valid in object 매개 변수를 사용할 때와 동일한 결과를 얻으려고 합니다.개체가 잘못된 경우 예외(MethodArgumentNotValidException)가 @RestControllerAdvise를 가진 내 ExceptionHandlerControllerController에 의해 느려집니다.

이 경우 개체의 유효성을 검사하려고 하지만 서비스 계층에서만 유효성을 검사할 수 있습니다.개체에 유효성 검사 주석이 있으므로 내 ExceptionHandlerController에서 처리할 MethodArgumentNotValidException을 프로그래밍 방식으로 던지려고 하지만 성공하지 못했습니다.

지금까지 저는 다음과 같습니다.

private void verifyCard(CardRequest card) {
    BeanPropertyBindingResult result = new BeanPropertyBindingResult(card, "card");
    SpringValidatorAdapter adapter = new SpringValidatorAdapter(this.validator);
    adapter.validate(card, result);

    if (result.hasErrors()) {
        try {
            throw new MethodArgumentNotValidException(null, result);
        } catch (MethodArgumentNotValidException e) {
            e.printStackTrace();
        }
    }
}

첫 번째 매개 변수는 MethodParameter 유형에서 왔으며 이 개체를 만들 수 없습니다.그게 제 문제를 해결하는 가장 좋은 방법입니까?

편집 1:

시도/캐치 블록을 제거할 수 없습니다.제거하면 컴파일 오류가 발생합니다.어떻게 일합니까?

throw new MethodArgumentNotValidException(null, result);

메서드 매개 변수가 필요하기 때문에 위의 생성자가 작동하지 않습니다.유효한 생성자(참조)는 다음과 같습니다.

MethodArgumentNotValidException(MethodParameter parameter, BindingResult bindingResult);

따라서, 당신의 경우:

throw new MethodArgumentNotValidException(new MethodParameter(
this.getClass().getDeclaredMethod("verifyCard", YourClassName.class), 0), errors);

당신은 이미 그것을(를)catch블록, 제거해야 합니다.try-catch당신의 글로벌 핸들러가 그것을 잡도록.

그런 다음 아래와 같은 방법을 지정합니다.

private void verifyCard(CardRequest card) throws MethodArgumentNotValidException

MethodArgumentNotValidException의 하위 클래스입니다.Exception즉, "확인됨"을 의미합니다.그것을 당신의 밖으로 버리는 것.verifyCard(..)방법, 당신은 그것을 선언해야 합니다.verifyCard(..)던질 수 있음:

private void verifyCard(CardRequest card) throws MethodArgumentNotValidException {
// your code
}

가지고 계신다면,lombok프로젝트의 의존성, 당신은 또한 사용함으로써 컴파일러를 속일 수 있습니다.@SneakyThrows주석

https://projectlombok.org/features/SneakyThrows

언급URL : https://stackoverflow.com/questions/49339406/how-to-properly-throw-methodargumentnotvalidexception

반응형