Springは、Spring検証とJSR-303 Bean検証の2つの異なる検証方法をサポートしています。 Beanバリデータを含む他のデリゲータに委任するSpringバリデータを定義することにより、両方を使用できます。ここまでは順調ですね。
しかし、検証を実際に要求するメソッドに注釈を付ける場合、それは別の話です。このように注釈を付けることができます
@RequestMapping(value = "/object", method = RequestMethod.POST)
public @ResponseBody TestObject create(@Valid @RequestBody TestObject obj, BindingResult result) {
またはこのように
@RequestMapping(value = "/object", method = RequestMethod.POST)
public @ResponseBody TestObject create(@Validated @RequestBody TestObject obj, BindingResult result) {
ここで、@ Validは javax.validation.Valid であり、@ Validatedは org.springframework.validation.annotation.Validated です。後者のドキュメントは言う
JSR-303のValidのバリアント。検証グループの仕様をサポートします。 SpringのJSR-303サポートで便利に使用できるように設計されていますが、JSR-303固有ではありません。
どのように違うのか正確にはわからないため、これはあまり役に立ちません。もしそうなら。どちらも私にはかなりうまく機能しているようです。
ドキュメントから引用したように、「検証グループ」、つまり検証済みBeanのフィールドグループをサポートするために@Validated
が追加されました。これは、最初のステップで名前、電子メールなどを検証できるマルチステップフォームで使用できます。その後、次のステップで他のフィールドを検証します。
これが@Valid
注釈に追加されなかった理由は、Javaコミュニティプロセス(JSR-303)を使用して標準化されているためです。
このjiraチケット に移動して、注釈がどのように存在したかを確認します。
より簡単な答え。まだ一体何なのかわからない人のために "検証グループ"。
@Valid
検証の使用法
コントローラ:
@RequestMapping(value = "createAccount")
public String stepOne(@Valid Account account) {...}
フォームオブジェクト:
public class Account {
@NotBlank
private String username;
@Email
@NotBlank
private String email;
}
@Validated
検証グループの使用法
出典: http://blog.codeleak.pl/2014/08/validation-groups-in-spring-mvc.html
コントローラ:
@RequestMapping(value = "stepOne")
public String stepOne(@Validated(Account.ValidationStepOne.class) Account account) {...}
@RequestMapping(value = "stepTwo")
public String stepTwo(@Validated(Account.ValidationStepTwo.class) Account account) {...}
フォームオブジェクト:
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;
}