1. 概要

bean検証制約を誤用するのは簡単です。 たとえば、誤ってString属性を@Future制約で装飾する可能性があります。 このような間違いは、実行時に予測できないエラーにつながる可能性があります。

幸い、 Hibernate Validator Annotation Processor は、コンパイル時にこれらの問題を検出するのに役立ちます。 スローされるエラーのおかげで、これらのバグを早期に発見できます。

このチュートリアルでは、プロセッサを構成する方法を探り、プロセッサが見つけることができるいくつかの一般的な問題を見ていきます。

2. 構成

2.1. インストール

アノテーションプロセッサの依存関係をpom.xmlに追加することから始めましょう。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.6.1</version>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <compilerArgs>
            <arg>-Averbose=true</arg>
            <arg>-AmethodConstraintsSupported=true</arg>
            <arg>-AdiagnosticKind=ERROR</arg>
        </compilerArgs>
        <annotationProcessorPaths>
            <path>
                <groupId>org.hibernate.validator</groupId>
                <artifactId>hibernate-validator-annotation-processor</artifactId>
                <version>6.2.0.Final</version>
            </path>
        </annotationProcessorPaths>
    </configuration>
</plugin>

このツールのバージョン7は、jakarta.validation制約とのみ互換性があることに注意してください。

<dependency>
    <groupId>jakarta.validation</groupId>
    <artifactId>jakarta.validation-api</artifactId>
    <version>3.0.1</version>
</dependency>

プロセッサは、主要なJavaIDE用にセットアップする方法に関するガイダンスも提供します。

2.2. コンパイラオプション

プロセッサコンパイラオプションを設定しましょう。

<compilerArgs>
    <arg>-Averbose=true</arg>
    <arg>-AmethodConstraintsSupported=true</arg>
    <arg>-AdiagnosticKind=ERROR</arg>
</compilerArgs>

まず、diagnosticKindオプションはロギングレベルを対象としています。 コンパイル時に問題をキャッチするために、デフォルトのERROR値を維持することをお勧めします。 許可されるすべての値は、Diagnostic.Kind列挙型で参照されます。

次に、アノテーションの検証をゲッターのみに制限する場合は、methodConstraintsSupportedオプションをfalseに設定する必要があります。

ここでは、verbosetrueに設定して出力を増やしていますが、大量のログ出力が必要ない場合は、falseに設定できます。 。

3. 一般的な制約の問題

注釈プロセッサには、チェックするための一連の事前定義されたエラーが付属しています。 例として単純なMessageクラスを使用して、そのうちの3つを詳しく見てみましょう。

public class Message {
    // constructor omitted
}

3.1. ゲッターのみに注釈を付けることができます

まず、この問題は、プロセッサのデフォルトオプションでは存在しないはずです。 名前が示すように、非ゲッターメソッドにアノテーションを付けるとポップアップします。 これを可能にするには、methodConstraintsSupportedオプションをtrueに設定する必要があります。

Messageクラスに3つのアノテーション付きメソッドを追加しましょう。

@Min(3)
public boolean broadcast() {
    return true;
}

@NotNull
public void archive() {
}

@AssertTrue
public boolean delete() {
    return false;
}

次に、構成でmethodConstraintsSupportedオプションをfalseに設定します。

<compilerArgs>
    <arg>AmethodConstraintsSupported=false</arg>
</compilerArgs>

最後に、3つの方法により、プロセッサは問題を検出します。

[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] ${home}\baeldung\tutorials\javaxval\src\main\java\com\baeldung\javaxval\methodvalidation\model\ReservationManagement.java:[25,4] error: Constraint annotations must not be specified at methods, which are no valid JavaBeans getter methods.
[ERROR] ${home}\baeldung\tutorials\javaxval\src\main\java\com\baeldung\javaxval\hibernate\validator\ap\Message.java:[55,4] error: Constraint annotations must not be specified at methods, which are no valid JavaBeans getter methods.
[ERROR] ${home}\baeldung\tutorials\javaxval\src\main\java\com\baeldung\javaxval\hibernate\validator\ap\Message.java:[38,5] error: Constraint annotations must not be specified at methods, which are no valid JavaBeans getter methods.
[ERROR] ${home}\baeldung\tutorials\javaxval\src\main\java\com\baeldung\javaxval\hibernate\validator\ap\Message.java:[47,4] error: Constraint annotations must not be specified at methods, which are no valid JavaBeans getter methods.
[INFO] 4 errors
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  5.457 s
[INFO] Finished at: 2022-01-20T21:42:47Z
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.6.1:compile (default-compile) on project javaxval: Compilation failure: Compilation failure:
[ERROR] ${home}\baeldung\tutorials\javaxval\src\main\java\com\baeldung\javaxval\methodvalidation\model\ReservationManagement.java:[25,4] error: Constraint annotations must not be specified at methods, which are no valid JavaBeans getter methods.
[ERROR] ${home}\baeldung\tutorials\javaxval\src\main\java\com\baeldung\javaxval\hibernate\validator\ap\Message.java:[55,4] error: Constraint annotations must not be specified at methods, which are no valid JavaBeans getter methods.
[ERROR] ${home}\baeldung\tutorials\javaxval\src\main\java\com\baeldung\javaxval\hibernate\validator\ap\Message.java:[38,5] error: Constraint annotations must not be specified at methods, which are no valid JavaBeans getter methods.
[ERROR] ${home}\baeldung\tutorials\javaxval\src\main\java\com\baeldung\javaxval\hibernate\validator\ap\Message.java:[47,4] error: Constraint annotations must not be specified at methods, which are no valid JavaBeans getter methods.

delete メソッドは、技術的には適切に注釈が付けられていますが、この問題の影響を受けることに注意してください。

次のセクションでは、methodConstraintsSupportedオプションをtrueに戻します。

3.2. 非ボイドメソッドのみに注釈を付けることができます

この問題は、voidメソッドを制約検証で装飾すべきではないことを示しています。 Messageクラスのarchiveメソッドに注釈を付けることで、実際の動作を確認できます。

@NotNull
public void archive() {
}

これにより、プロセッサでエラーが発生します。

[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] ${home}\baeldung\tutorials\javaxval\src\main\java\com\baeldung\javaxval\hibernate\validator\ap\Message.java:[45,4] error: Void methods may not be annotated with constraint annotations.
[INFO] 1 error
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  4.078 s
[INFO] Finished at: 2022-01-20T21:35:08Z
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.6.1:compile (default-compile) on project javaxval: Compilation failure
[ERROR] ${home}\baeldung\tutorials\javaxval\src\main\java\com\baeldung\javaxval\hibernate\validator\ap\Message.java:[45,4] error: Void methods may not be annotated with constraint annotations.

3.3. 注釈のサポートされていないタイプ

この最後の問題は最も一般的です。 これは、アノテーションのターゲットデータ型がターゲットプロパティと一致しない場合に発生します。 Message クラスで実際に動作することを確認するために、誤って注釈が付けられたString属性をMessageクラスに追加しましょう。

@Past 
private String createdAt;

@Pastアノテーションが原因でエラーが発生します。 実際、この制約を使用できるのは日付タイプのみです。

[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] ${home}\baeldung\tutorials\javaxval\hibernate\validator\ap\Message.java:[20,5] error: The annotation @Past is disallowed for this data type.
[INFO] 1 error
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  4.892 s
[INFO] Finished at: 2022-01-20T21:29:15Z
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.6.1:compile (default-compile) on project javaxval: Compilation failure
[ERROR] ${home}\baeldung\tutorials\javaxval\src\main\java\com\baeldung\javaxval\hibernate\validator\ap\Message.java:[20,5] error: The annotation @Past is disallowed for this data type.

サポートされていない戻り型を持つメソッドに間違ったアノテーションを適用すると、同様のエラーが発生します。

@Min(3)
public boolean broadcast() { 
    return true;
}

プロセッサのエラーメッセージは前のメッセージと同じです。

[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] ${home}\baeldung\tutorials\javaxval\src\main\java\com\baeldung\javaxval\hibernate\validator\ap\Message.java:[37,5] error: The annotation @Min is disallowed for the return type of this method.
[INFO] 1 error
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  3.761 s
[INFO] Finished at: 2022-01-20T21:38:28Z
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.6.1:compile (default-compile) on project javaxval: Compilation failure
[ERROR] ${home}\baeldung\tutorials\javaxval\src\main\java\com\baeldung\javaxval\hibernate\validator\ap\Message.java:[37,5] error: The annotation @Min is disallowed for the return type of this method.

4. 結論

この記事では、Hibernate ValidatorAnnotationProcessorを試しました。

まず、それをインストールし、そのオプションを構成しました。 次に、3つの一般的な制約の問題でその動作を調査しました。

いつものように、サンプルコードはGitHubにあります。