2

私は Java EE 6+ に付随する Bean Validation API について多くのことを読んでいて、検証 API がどのように機能するかの基本を理解していますが、私が読んでいるドキュメントでは、すべての例は単体テストであり、検証操作を実装する場所を理解するのに役立ちます。

私は 3 層アーキテクチャ システムを開発しています。検証をサービス層に配置したいので、プレゼンテーション層が異なる場合 (つまり、Jax-RS、JSF など) に検証コードを再利用できます。しかし、私は上記の操作を実装する方法について混乱しています。これが私が立ち往生している場所です:

モデル内のさまざまなエンティティと対話する Bean があります。たとえば、これはユーザー インタラクション用の Bean 内のメソッドです ->

public User getUser(
            @Min(value = 0, message = "Must have a positive userId") int uid)
            throws RetrievalNotFoundException {

        try {

            // I WANT TO VALIDATE UID HERE

            // find User with provided uid
            User foundUser = em.find(User.class, uid);

            // IF the user is inactive
            if (foundUser.getIsActive() == 0) {
                // cannot find the content
                throw new RetrievalNotFoundException();
            }

            // close the entity manager
            em.close();
            // return the user
            return foundUser;


    }

休止状態のドキュメントの例を次に示します。

Car object = new Car( "Morris" );
Method method = Car.class.getMethod( "drive", int.class );
Object[] parameterValues = { 80 };
Set<ConstraintViolation<Car>> violations = executableValidator.validateParameters(
        object,
        method,
        parameterValues  
);

assertEquals( 1, violations.size() );
Class<? extends Annotation> constraintType = violations.iterator()
        .next()
        .getConstraintDescriptor()
        .getAnnotation()
        .annotationType();
assertEquals( Max.class, constraintType );

メソッド getUser() にアクセスするために、Bean を再度インスタンス化する必要があるのでしょうか。私は混乱しています。私が持っていた別の質問は、誰かが int コンテナーをオーバーフローする uid の int を入れることにした場合はどうなるかということでした。どうすればそれを検証できますか?

本当にありがとうございました。

4

1 に答える 1

4

あなたの質問へのいくつかのコメント。まず、Bean Validation は実際には EE 6 と EE 7 の一部です。ただし、EE 6 には Bean Validation 1.0 しか含まれていませんが、EE 7 には Bean Validation 1.1 が含まれています。違いは、Bean Validation 1.0 にはまだメソッドの検証が含まれておらず、それが例に示されていることです。バージョン 4 以降、Hibernate Validator には Hibernate Validator 固有のメソッド検証 API が含まれていますが、これは標準の一部ではなく、Bean Validation 1.1 および Hibernate Validator 5 で指定されているものとは少し異なります。

2 番目のコメントは、メソッドの検証を実行するために必要なコードに関するものです。Bean Validation は、メソッド レベルの検証を行うメカニズムのみを提供します。これは、例で参照している API です。ほとんどの場合、それを利用するには何らかの傍受技術が必要です。たとえば、Java EE 7 は、CDI インターセプターを使用して、デフォルトでメソッドの検証を行います。これは標準の一部です。http://beanvalidation.org/1.1/spec/#integration-cdiを参照してください。EE 6 を使用する場合は、選択したテクノロジを使用して独自のインターセプト ロジックを作成する必要があります。

最後の質問について。オーバーフローは一般的に検出可能ではないと思います。この場合、Bean Validation でできることは何もありません。

于 2013-07-08T08:43:36.590 に答える