What does the @Valid annotation indicate in Spring?

前端 未结 8 1533
隐瞒了意图╮
隐瞒了意图╮ 2020-12-04 20:38

In the following example, the ScriptFile parameter is marked with an @Valid annotation.

What does @Valid annotation do?

<
8条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-04 21:21

    I think I know where your question is headed. And since this question is the one that pop ups in google's search main results, I can give a plain answer on what the @Valid annotation does.

    I'll present 3 scenarios on how I've used @Valid

    Model:

    public class Employee{
    private String name;
    @NotNull(message="cannot be null")
    @Size(min=1, message="cannot be blank")
    private String lastName;
     //Getters and Setters for both fields.
     //...
    }
    

    JSP:

    ...
    
     
     
    ...

    Controller for scenario 1:

         @RequestMapping("processForm")
            public String processFormData(@Valid @ModelAttribute("employee") Employee employee){
            return "employee-confirmation-page";
        }
    

    In this scenario, after submitting your form with an empty lastName field, you'll get an error page since you're applying validation rules but you're not handling it whatsoever.

    Example of said error: Exception page

    Controller for scenario 2:

     @RequestMapping("processForm")
        public String processFormData(@Valid @ModelAttribute("employee") Employee employee,
    BindingResult bindingResult){
                    return bindingResult.hasErrors() ? "employee-form" : "employee-confirmation-page";
                }
    

    In this scenario, you're passing all the results from that validation to the bindingResult, so it's up to you to decide what to do with the validation results of that form.

    Controller for scenario 3:

    @RequestMapping("processForm")
        public String processFormData(@Valid @ModelAttribute("employee") Employee employee){
                    return "employee-confirmation-page";
                }
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public Map invalidFormProcessor(MethodArgumentNotValidException ex){
      //Your mapping of the errors...etc
    }
    

    In this scenario you're still not handling the errors like in the first scenario, but you pass that to another method that will take care of the exception that @Valid triggers when processing the form model. Check this see what to do with the mapping and all that.

    To sum up: @Valid on its own with do nothing more that trigger the validation of validation JSR 303 annotated fields (@NotNull, @Email, @Size, etc...), you still need to specify a strategy of what to do with the results of said validation.

    Hope I was able to clear something for people that might stumble with this.

提交回复
热议问题