web-dev-qa-db-ja.com

Springでの@Validと@Validatedの違い

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固有ではありません。

どのように違うのか正確にはわからないため、これはあまり役に立ちません。もしそうなら。どちらも私にはかなりうまく機能しているようです。

68
Sergei Tachenov

ドキュメントから引用したように、「検証グループ」、つまり検証済みBeanのフィールドグループをサポートするために@Validatedが追加されました。これは、最初のステップで名前、電子メールなどを検証できるマルチステップフォームで使用できます。その後、次のステップで他のフィールドを検証します。

これが@Valid注釈に追加されなかった理由は、Javaコミュニティプロセス(JSR-303)を使用して標準化されているためです。

このjiraチケット に移動して、注釈がどのように存在したかを確認します。

55
frant.hartm

より簡単な答え。まだ一体何なのかわからない人のために "検証グループ"

@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;

}
35
Zhu Hang