What does the @Valid annotation indicate in Spring?

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

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

What does @Valid annotation do?

<
相关标签:
8条回答
  • 2020-12-04 21:14

    Adding to above answers, take a look at following. AppointmentForm's date column is annotated with couple of annotations. By having @Valid annotation that triggers validations on the AppointmentForm (in this case @NotNull and @Future). These annotations could come from different JSR-303 providers (e.g, 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;
        }
    
    0 讨论(0)
  • 2020-12-04 21:18

    It's for validation purposes.

    Validation It is common to validate a model after binding user input to it. Spring 3 provides support for declarative validation with JSR-303. This support is enabled automatically if a JSR-303 provider, such as Hibernate Validator, is present on your classpath. When enabled, you can trigger validation simply by annotating a Controller method parameter with the @Valid annotation: After binding incoming POST parameters, the AppointmentForm will be validated; in this case, to verify the date field value is not null and occurs in the future.


    Look here for more info:
    http://blog.springsource.com/2009/11/17/spring-3-type-conversion-and-validation/

    0 讨论(0)
  • 2020-12-04 21:20

    @Valid in itself has nothing to do with Spring. It's part of Bean Validation specification(there are several of them, the latest one being JSR 380 as of second half of 2017), but @Valid is very old and derives all the way from JSR 303.

    As we all know, Spring is very good at providing integration with all different JSRs and java libraries in general(think of JPA, JTA, Caching, etc.) and of course those guys took care of validation as well. One of the key components that facilitates this is MethodValidationPostProcessor.

    Trying to answer your question - @Valid is very handy for so called validation cascading when you want to validate a complex graph and not just a top-level elements of an object. Every time you want to go deeper, you have to use @Valid. That's what JSR dictates. Spring will comply with that with some minor deviations(for example I tried putting @Validated instead of @Valid on RestController method and validation works, but the same will not apply for a regular "service" beans).

    0 讨论(0)
  • 2020-12-04 21:20

    Another handy aspect of @Valid not mentioned above is that (ie: using Postman to test an endpoint) @Valid will format the output of an incorrect REST call into formatted JSON instead of a blob of barely readable text. This is very useful if you are creating a commercially consumable API for your users.

    0 讨论(0)
  • 2020-12-04 21:21

    Just adding to the above answer, In a web application @valid is used where the bean to be validated is also annotated with validation annotations e.g. @NotNull, @Email(hibernate annotation) so when while getting input from user the values can be validated and binding result will have the validation results. bindingResult.hasErrors() will tell if any validation failed.

    0 讨论(0)
  • 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:

    ...
    <form:form action="processForm" modelAttribute="employee">
     <form:input type="text" path="name"/>
     <br>
     <form:input type="text" path="lastName"/>
    <form:errors path="lastName"/>
    <input type="submit" value="Submit"/>
    </form:form>
    ...
    

    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<String, String> 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.

    0 讨论(0)
提交回复
热议问题