9

@Validメソッドパラメータレベルに置くときの注釈の目的は何ですか?

public void (@Valid Person p) { ... }

テストを作成し、このメソッドに無効なオブジェクトを渡しましたが、何も起こりません。
例外が発生することを期待しています。

4

2 に答える 2

16

オブジェクトの @Valid注釈は、注釈付きオブジェクトを処理するための検証フレームワークへの指示です。メソッドのパラメーターで使用される場合、これはメソッド レベルの検証と呼ばれます。メソッド レベルの検証はコア仕様の一部ではなく、実際には Bean Validation がコンテナー タイプ フレームワーク (JSF、CDI、Java EE) に統合されている場合にのみサポートされることに注意してください。Bean Validation がそのようなサポート コンテナーに統合されると、ライフサイクル メソッドが Bean で呼び出されると、コンテナーはメソッド パラメーターで JSR 303 アノテーションを検出し、関連する Bean の検証をトリガーします。

たとえば、JAX-RS リソース クラスに次のメソッド定義があるとします。

@Path("/example")
public class MyExampleResourceImpl {

    @POST
    @Path("/")
    public Response postExample(@Valid final Example example) {
        // ....
    }
}

postExampleJAX-RS コンテナーによって処理されている要求に応答してメソッドが呼び出されると、Beanexampleが検証されます。この動作を、スタンドアロンの Java SE アプリケーションを実行している場合と比較してください。

public class MyMainClass {
    public static void main(final String[] args) {
        final MyMainClass clazz = new MyMainClass();
        clazz.echo(new Example());
    }

    public Example echo(@Valid final Example example) {
        // ...
    }
}

この場合、すべての JSR 303 ランタイム JAR を含めたとしても、プログラムを実行してもパラメーターの検証はトリガーされません。Exampleこれは、メソッド レベルの検証を実装する利用可能なコンテナーがないためです。Bean Validation Specificationでは、付録 C でこれらすべてについて詳細に説明しています。参考までに、その一部を以下に引用します。

メソッドレベルの検証の提案

この命題はコア仕様に統合されておらず、その一部でもありません。考古学的目的のためにここに残され、この仕様の将来の改訂について真剣に検討されます。この提案は、残りの仕様アーティファクトとは少しずれている可能性があります。

注: Bean Validation プロバイダーは、この提案を特定の拡張機能として自由に実装できます。このような特定の拡張機能には、たとえば Validator.unwrap メソッドを使用してアクセスできます。

一般的な要求は、仕様の制約記述を再利用するメソッドおよびパラメーター レベルの検証メカニズムを提供することでした。この一連の API は、次のようなインターセプター フレームワークによって使用されることを意図しています。

  • のようなアプリケーション フレームワーク
    • JSR-299
  • Enterprise Java Beans などのコンポーネント フレームワーク
  • アスペクトベースのフレームワーク

これらのフレームワークは、検証 API を呼び出して、メソッドが呼び出されたときにパラメーター リストまたはメソッドの戻り値を検証できます。より正確には、検証はメソッド呼び出しの前後で発生します。この Bean Validation API の拡張により、コア エンジンと、そのようなメソッド レベルの検証のための制約定義および宣言を再利用できます。

于 2013-01-25T14:33:25.833 に答える
1

その目的は、定義された制約に対してオブジェクトを検証することです。

休止状態のドキュメントから

関連付けられたオブジェクトに対して再帰的に検証を実行します。オブジェクトがコレクションまたは配列の場合、要素は再帰的に検証されます。オブジェクトがマップの場合、値要素は再帰的に検証されます。

これは役立つかもしれませんhttp://www.mkyong.com/spring-mvc/spring-3-mvc-and-jsr303-valid-example/

于 2013-01-25T14:00:32.547 に答える