В системе пружин есть два вида проверки.
- A: Проверка параметров методов контроллера загрузочной пружины, работает только для данных тела http-запроса post в контроллере с
@Valid
или @Validated
в сторону - B: проверка уровня метода, работает для любых параметров метода и возвращает значения с
@Validated
в классе и @Valid
в сторону значений для проверки
Мы можем видеть что A более узкий, а B более распространенный. Я хотел бы ответить на вопрос по двум аспектам.
1 Ответы находятся в коде
Как описано в этом посте , часть more detail
, A и B вызывает улучшение метода через aop, вызывая другой метод в org.hibernate.validator.internal.engine.ValidatorImpl
, что приводит к разнице.
- Вызов метода
validate
в ValidatorImpl
через RequestResponseBodyMethodProcessor
- Вызов метода B
validateParameters
метод в ValidatorImpl
через MethodValidationInterceptor
Это разные методы с разными функциями, поэтому они приводят к разным результатам. Вы можете найти ответ, прочитав два метода.
2 Ответы содержатся в спецификации
. JSR-303 определяет функции методов, которые мы обсуждали выше. Метод
validate
описан в разделе метод проверки , и реализация должна подчиняться логике c, определенной в подпрограмме проверки , в которой говорится, что он выполнит всю проверку ограничений для всех достижимых полей объекта, поэтому элемент List
object (или другой экземпляр коллекции) не может быть проверен с помощью этого метода - элементы коллекции не являются полями экземпляра коллекции.
Но validateParameters
, JSR-303 на самом деле не рассматривает его как основной топи c и помещает его в Appendix C. Proposal for method-level validation
. Это дает некоторое описание:
The constraints declarations evaluated are the constraints hosted on the parameters of the method or constructor. If @Valid is placed on a parameter, constraints declared on the object itself are considered.
validateReturnedValue evaluates the constraints hosted on the method itself. If @Valid is placed on the method, the constraints declared on the object itself are considered.
public @NotNull String saveItem(@Valid @NotNull Item item, @Max(23) BigDecimal price)
In the previous example,
- item is validated against @NotNull and all the constraints it hosts
- price is validated against @Max(23)
- the result of saveItem is validated against @NotNull
и восклицает, что Bean Validation providers are free to implement this proposal as a specific extension
. Насколько я знаю, проект Hibernate Validation
реализует этот метод, заставляет работать ограничения для самого объекта и элемента объекта коллекции.
3 Некоторые жалуются
Я не знаю почему ребята из фреймворка Spring звонят validate
в RequestResponseBodyMethodProcessor
, поэтому многие вопросы появляются в stackoverflow. Может быть, это потому, что данные тела сообщения http обычно являются данными формы и могут быть представлены в виде бина java естественным образом. Если это я, я позвоню по номеру validateParametes
in RequestResponseBodyMethodProcessor
для удобства использования.