Difference between @Valid and @Validated in Spring
As you quoted from the documentation, @Validated
was added to support "validation groups", i.e. group of fields in the validated bean. This can be used in multi step forms where you may validate name, email, etc.. in first step and then other fields in following step(s).
The reason why this wasn't added into @Valid
annotation is because that it is standardized using the java community process (JSR-303), which takes time and Spring developers wanted to allow people to use this functionality sooner.
Go to this jira ticket to see how the annotation came into existence.
A more straight forward answer. For those who still don't know what on earth is "validation group".
Usage for @Valid
Validation
Controller:
@RequestMapping(value = "createAccount")
public String stepOne(@Valid Account account) {...}
Form object:
public class Account {
@NotBlank
private String username;
@Email
@NotBlank
private String email;
}
Usage for @Validated
Validation Group
Source: http://blog.codeleak.pl/2014/08/validation-groups-in-spring-mvc.html
Controller:
@RequestMapping(value = "stepOne")
public String stepOne(@Validated(Account.ValidationStepOne.class) Account account) {...}
@RequestMapping(value = "stepTwo")
public String stepTwo(@Validated(Account.ValidationStepTwo.class) Account account) {...}
Form object:
public class Account {
@NotBlank(groups = {ValidationStepOne.class})
private String username;
@Email(groups = {ValidationStepOne.class})
@NotBlank(groups = {ValidationStepOne.class})
private String email;
@NotBlank(groups = {ValidationStepTwo.class})
@StrongPassword(groups = {ValidationStepTwo.class})
private String password;
@NotBlank(groups = {ValidationStepTwo.class})
private String confirmedPassword;
}
In the example code snippets of the question, @Valid
and @Validated
make no difference. But if the @RequestBody
is annotated with a List
object, or is a string value annotated by @RequestParam
, the validation will not take effect.
We can use the @Validated
's method-level validation capability to make it work. To achieve this, the key point is to place @Validated
on the class. This may be another important difference between @Valid
and @Validated
in spring framework.
Refrence
- Spring boot docs