春の@Validと@Validatedの違い


106

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

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


2
面白いかもしれません:stackoverflow.com/questions/18911154/...
ヴィムDeblauwe

4
「検証グループの仕様のサポート」は非常に明確な声明です。
より良いオリーブ

ValidはJSR 303検証(NotNullなど)と密接に結びついていると思います。一方、他の検証/グループを作成し、それらを検証済みでチェックすることができます。
Atul 2016年

@ zeroflagL、true、しかし、私はそれを使用したことがないので、要点を逃し、代わりに「JSR-303固有ではない」部分に固執しました。今では明らかです。
Sergei Tachenov 2016年

回答:


83

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

これが@Validアノテーションに追加されなかった理由は、Javaコミュニティプロセス(JSR-303)を使用して標準化されているためです。これには時間がかかり、Spring開発者はこの機能をより早く使用できるようにしたいと考えていました。

このjiraチケットに移動し、アノテーションがどのようにして生まれたかを確認してください。


112

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

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

}

@ Zhuhang.jasperに、シンプルで詳細に説明してくれてありがとう。
Gautam Tyagi

これはまさに私が過去2時間探していたものです。ありがとう@ Zhuhang.jasper
Shady Hussein

@zhuhangに感謝します。これを探してきました。
Vishnu Dahatonde

4

質問のサンプルコードスニペットでは、違いは@Validあり@Validatedません。ただし、@RequestBodyListオブジェクトで注釈されている場合、またはによって注釈が付けられた文字列値である場合@RequestParam、検証は有効になりません。

@Validatedのメソッドレベルの検証機能を使用して機能させることができます。これを実現する@Validatedには、クラスに配置することが重要です。これは、間に別の重要な違いかもしれ@Validおよび@ValidatedSpringフレームワークインチ

屈折


アノテーションがListオブジェクトに影響を与えない理由を説明できますか?これは他のコレクションでも機能しないと思いMapますか?たぶん、あなたは私に私の質問では、より詳細な説明を与えることができる:stackoverflow.com/questions/60167961/...
Theiaz

1
@Theiazお望み通り
レベッカ

1

上記に加えて、@Validネストされた検証のドメイン/フィールドにのみ適用でき、では使用できません@validated

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.