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
'programing' 카테고리의 다른 글
| 왼쪽과 오른쪽 쉬프트를 한 표현에 함께 사용하면 차이가 나는 이유는 무엇입니까? (0) | 2023.08.21 |
|---|---|
| 저장 프로시저가 테이블 내용을 업데이트하지 않습니다. (0) | 2023.08.21 |
| jdbc Timestamp 또는 Date를 사용할 때 Oracle과 무시할 수 없는 실행 계획 차이 (0) | 2023.08.21 |
| 값을 기준으로 2차원 배열을 필터링하는 방법 (0) | 2023.08.21 |
| PowerShell FINDSTR과 동등합니까? (0) | 2023.08.21 |