Что указывает аннотация @Valid в Spring? - PullRequest
65 голосов
/ 29 августа 2010

В следующем примере параметр ScriptFile отмечен аннотацией @Valid.

Что делает аннотация @Valid?

@RequestMapping(value = "/scriptfile", method = RequestMethod.POST)    
public String create(@Valid ScriptFile scriptFile, BindingResult result, ModelMap modelMap) {    
    if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");        
    if (result.hasErrors()) {        
        modelMap.addAttribute("scriptFile", scriptFile);            
        modelMap.addAttribute("showcases", ShowCase.findAllShowCases());            
        return "scriptfile/create";            
    }        
    scriptFile.persist();        
    return "redirect:/scriptfile/" + scriptFile.getId();        
}    

Ответы [ 7 ]

51 голосов
/ 29 августа 2010

Это для проверки.

Валидация. модель после привязки пользовательского ввода к нему. Spring 3 обеспечивает поддержку декларативная проверка с JSR-303. Эта поддержка включена автоматически если поставщик JSR-303, такой как Hibernate Validator, присутствует на ваш классный путь. Когда включено, вы можете вызвать проверку просто аннотирование метода контроллера параметр с аннотацией @Valid: После привязки входящего POST параметры, AppointmentForm будет пройти валидацию; в этом случае, чтобы проверить значение поля даты не является нулевым и происходит в будущем.


Смотрите здесь для получения дополнительной информации:
http://blog.springsource.com/2009/11/17/spring-3-type-conversion-and-validation/

25 голосов
/ 07 октября 2015

Добавляя ответы выше, взгляните на следующее. Столбец AppointmentForm date аннотирован парой аннотаций. Наличие аннотации @Valid, которая запускает проверки на AppointmentForm (в данном случае @NotNull и @Future). Эти аннотации могут исходить от разных провайдеров JSR-303 (например, Hibernate, Spring..etc).

    @RequestMapping(value = "/appointments", method = RequestMethod.POST)
    public String add(@Valid AppointmentForm form, BindingResult result) {
        ....
    }

    static class AppointmentForm {

        @NotNull @Future
        private Date date;
    }
14 голосов
/ 29 августа 2010

IIRC @Valid - это не аннотация Spring, а аннотация JSR-303 (которая является стандартом проверки бинов). Что он делает, так это в основном проверяет, являются ли данные, которые вы отправляете в метод, действительными или нет (это подтвердит скрипт scriptFile для вас).

12 голосов
/ 09 ноября 2017

@Valid само по себе не имеет ничего общего с Spring.Это часть спецификации Bean Validation (есть несколько из них, последняя из которых - JSR 380 на второе полугодие 2017 года), но @Valid очень старая и полностью основана на JSR 303.

Какмы все знаем, что Spring очень хорошо обеспечивает интеграцию со всеми различными JSR и библиотеками Java в целом (например, JPA, JTA, Caching и т. д.), и, конечно, эти ребята также позаботились о проверке.Одним из ключевых компонентов, способствующих этому, является MethodValidationPostProcessor .

Попытка ответить на ваш вопрос - @Valid очень удобно для так называемого каскадного валидации, когда вы хотите проверить сложный граф, а непросто элементы верхнего уровня объекта.Каждый раз, когда вы хотите пойти глубже, вы должны использовать @Valid.Это то, что диктует JSR.Spring выполнит это с некоторыми незначительными отклонениями (например, я попытался поместить @Validated вместо @Valid в метод RestController и проверка работоспособности, но то же самое не будет применяться к обычным компонентам "service").

2 голосов
/ 08 ноября 2015
public String create(@Valid @NotNull ScriptFile scriptFile, BindingResult result, ModelMap modelMap) {    
    if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");        

Полагаю, эта аннотация @NotNull действительна, поэтому, если условие не требуется.

1 голос
/ 23 июня 2015

Просто добавив к ответу выше, в веб-приложении @valid используется там, где проверяемый компонент также аннотирован валидационными аннотациями, например, @NotNull, @Email (аннотация спящего), поэтому при получении ввода от пользователязначения могут быть проверены, и результат привязки будет иметь результаты проверки.bindingResult.hasErrors() сообщит, не прошла ли проверка.

0 голосов
/ 12 января 2019

Еще один полезный аспект @Valid, не упомянутый выше, заключается в том, что (то есть: использование Postman для проверки конечной точки) @Valid будет форматировать вывод неправильного вызова REST в форматированный JSON вместо двоичного объекта с едва читаемым текстом.Это очень полезно, если вы создаете коммерчески доступный API для своих пользователей.

...