Почему Spring Boot генерирует разные исключения для проверки аргументов метода Controller? - PullRequest
0 голосов
/ 06 июня 2019

При проверке типа примитива или его эквивалента (Integer, Boolean) с использованием аннотаций проверки ограничений (@Min, @NotNull, ...) Spring Boot генерирует ConstraintViolationException.Но при проверке параметра с использованием аннотации @Valid создается MethodArgumentNotValidException.

У меня есть класс, помеченный @ControllerAdvice для обработки исключений из контроллеров.Проблема в том, что в зависимости от версии spring-boot-starter-parent результаты могут сильно отличаться.При использовании версии 2.0.5.RELEASE мне просто нужно было включить обработчик для класса ConstraintViolationException.Но есть и другие версии, к которым также добавляется MethodArgumentNotValidException.

Это уже упоминалось в выпуске GitHub , но без полезного ответа ...

I 'Я воспользуюсь примером lukasniemeier-zalando здесь.Для получения более подробной информации нажмите на ссылку выше.

 @Validated  // needed to actually trigger validation
 @RestController
 class MyController {

   @RequestMapping
   Response serve(
     @RequestParam @Min(2) Integer parameter,  // throws ConstraintViolationException
     @RequestBody @Valid BodyModel body        // throws MethodArgumentNotValidException
     ) {
       return new Response();
     }

 }

Я ожидаю, что обе проверки выдают одно и то же исключение, независимо от того, какая из них, просто для согласованности.

Очевидно, что нет никаких причинчтобы это было похоже на это, по крайней мере это было то, что я понял из этой другой проблемы GitHub .

Тогда я просто хочу получить ответ, почему Spring Boot генерирует 2 типа исключений для представленията же проблема (проверка аргумента).

Примечание : как упоминалось ранее, при использовании версии 2.0.5.RELEASE spring-boot-starter-parent этого не происходит.

<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>

Но, как сообщалось в последней проблеме GitHub, которую я связал, версия 2.0.0.M4 имеет такое поведение, и я также испытал ее с версией 2.2.0.M3.

Ответы [ 2 ]

1 голос
/ 06 июня 2019

Они обрабатываются различными механизмами проверки. @Validated в классе обрабатывается MethodValidationInterceptor, который является механизмом проверки общего назначения для классов. Из-за этого он выбрасывает ConstraintViolationException. @Validated используется здесь просто потому, что аннотация @Valid не разрешена для типов. Следовательно, единственный способ включить / вызвать MethodValidationInterceptor - использовать аннотацию @Validation.

@Valid в аргументе метода в контроллере обрабатывается внутренне ModelAttributeMethodProcessor и приводит к исключению привязки к сети , MethodArgumentNotValidException . ModelAttributeMethodProcessor вызывается (косвенно) из RequestMappingHandlerAdapter при подготовке вызова метода. Вместо @Valid вы также можете использовать аннотацию @Validated в аргументе метода. Spring MVC поддерживает оба (на самом деле он поддерживал @Validated до того, как @Valid даже существовал!).

Решение / обходной путь заключается в создании собственного обработчика исключений, который обрабатывает ConstraintViolationException так же, как MethodArgumentNotValidException. Что также предлагается в выпуске GitHub, на который вы ссылаетесь.

0 голосов
/ 06 июня 2019

Проверьте эти документы:

1 - https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/MethodArgumentNotValidException.html

2 - https://docs.oracle.com/javaee/7/api/javax/validation/ConstraintViolationException.html

MethodArgumentNotValidException исключение, которое выдается, когда проверка по аргументу, помеченному @Valid, завершается неудачей.

ConstraintViolationException исключение, которое генерируется при сбое проверки аргумента, аннотированного ограничением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...