Подтвердить что ты не робот

Что означает аннотация @Valid в Spring?

В следующем примере параметр 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();        
}    
4b9b3361

Ответ 1

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

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


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

Ответ 2

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

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

    static class AppointmentForm {

        @NotNull @Future
        private Date date;
    }

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

public String create(@Valid @NotNull ScriptFile scriptFile, BindingResult result, ModelMap modelMap) {    
    if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");        

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

Ответ 6

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

Ответ 7

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