Red Hat Training

A Red Hat training course is available for Red Hat JBoss Enterprise Application Platform

第14章 Bean の検証

14.1. Bean Validation

Bean Validation あるいは JavaBeans Validation は、Java オブジェクトのデータを検証するモデルです。このモデルでは、組み込みのカスタムアノテーション制約を使い、アプリケーションデータの整合性を保ちます。この仕様は JSR 349: Bean Validation 1.1 で文書化されています。

Hibernate Validator は Bean Validation の JBoss EAP 実装であり、JSR の参照実装でもあります。

JBoss EAP は JSR 349 Bean Validation 1.1 仕様に完全準拠しています。また、Hibernate Validator によってこの仕様に追加機能が提供されます。

Bean Validation を初めて使用する場合は、JBoss EAP に同梱された bean-validation クイックスタートを参照してください。クイックスタートをダウンロードし、実行する方法については、クイックスタートサンプルの使用を参照してください。

14.2. バリデーション制約

14.2.1. バリデーション制約

バリデーション制約とは、フィールド、プロパティー、Bean などの Java 要素に適用するルールのことです。制約は通常、制限を設定する際に利用する一連の属性です。定義済みの制約がありますが、カスタムの制約も作成可能です。各制約は、アノテーション形式で表されます。

Hibernate Validator 用の同梱のバリデーション制約は、Hibernate Validator の制約にリストされています。

14.2.2. Red Hat JBoss Developer Studio での制約アノテーションの作成

概要

このタスクでは、Java アプリケーション内で使用できるように、Red Hat JBoss Developer Studio で制約アノテーションを作成するプロセスを説明します。

前提条件

  1. Red Hat JBoss Developer Studio で Java プロジェクトを開きます。
  2. データセットを作成します。

    制約アノテーションには、許容値を定義するデータセットが必要です。

    1. Project Explorer (プロジェクトエクスプローラー) パネルでプロジェクトルートフォルダーを右クリックします。
    2. New → Enum を選択します。
    3. 以下の要素を設定してください。

      • パッケージ:
      • 名前:
    4. Add…​ ボタンをクリックして必要なインターフェースを追加します。
    5. Finish をクリックしてファイルを作成します。
    6. 値セットをデータセットに追加し、Save をクリックします。

データセットの例

package com.example;

public enum CaseMode {
    UPPER,
    LOWER;
}
  1. アノテーションファイルを作成します。

    新しい Java クラスを作成します。

  2. 制約アノテーションを設定し、Save をクリックします。

    制約アノテーションファイルの例

    package com.mycompany;
    
    import static java.lang.annotation.ElementType.*;
    import static java.lang.annotation.RetentionPolicy.*;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.Retention;
    import java.lang.annotation.Target;
    
    import javax.validation.Constraint;
    import javax.validation.Payload;
    
    @Target( { METHOD, FIELD, ANNOTATION_TYPE })
    @Retention(RUNTIME)
    @Constraint(validatedBy = CheckCaseValidator.class)
    @Documented
    public @interface CheckCase {
    
        String message() default "{com.mycompany.constraints.checkcase}";
    
        Class<?>[] groups() default {};
    
        Class<? extends Payload>[] payload() default {};
    
        CaseMode value();
    
    }
    結果
    許容値のあるカスタムの制約アノテーションが作成され、Java プロジェクトで使用することができます。

14.2.3. Hibernate Validator の制約

注記

該当する場合は、アプリケーションレベルの制約により、以下の表の Hibernate Metadata Impact 列で説明されているデータベースレベルの制約が作成されます。

Java 固有のバリデーション制約

以下の表には、javax.validation.constraints パッケージに含まれる Java 仕様で定義されたバリデーション制約が示されています。

アノテーションプロパティータイプランタイムチェックHibernate Metadata の影響

@AssertFalse

ブール値

メソッドが false と評価することを確認します (アノテーションでなくコードで制約が表現されている場合に便利です)。

なし

@AssertTrue

ブール値

メソッドが true と評価することを確認します (アノテーションでなくコードで制約が表現されている場合に便利です)。

なし

@Digits(integerDigits=1)

数値または数値の文字列表現

プロパティーが integerDigits までの整数部と、fractionalDigits までの小数部を持つ数字であるかを確認します。

カラムの精度とスケールを定義します。

@Future

日付またはカレンダー

未来の日付であるかを確認します。

なし

@Max(value=)

数値または数値の文字列表現

値が最大値以下であるかを確認します。

カラムに check 制約を追加します。

@Min(value=)

数値または数値の文字列表現

値が最小値以上であるかを確認します。

カラムに check 制約を追加します。

@NotNull

 

値が null でないかを確認します。

カラムが null でないかを確認します。

@Past

日付またはカレンダー

過去の日付であるかを確認します。

カラムに check 制約を追加します。

@Pattern(regexp="regexp", flag=) または @Patterns( {@Pattern(…​)} )

文字列

プロパティーが一致フラグが指定された正規表現に一致するかどうかを確認します。java.util.regex.Pattern を参照してください。

なし

@Size(min=, max=)

アレイ、コレクション、マップ

要素サイズが最小値以上で最大値以下であるかどうかを確認します。

なし

@Valid

オブジェクト

紐付けされたオブジェクトに再帰的にバリデーションを実行します。オブジェクトがコレクションかアレイの場合は、要素は再帰的に検証されます。また、オブジェクトがマップの場合、値要素が再帰的に検証されます。

なし

注記

パラメーター @Valid は、javax.validation.constraints パッケージに存在しますが Bean Validation 仕様の一部です。

Hibernate Validator 固有のバリデーション制約

以下の表には、org.hibernate.validator.constraints パッケージに含まれるベンダー固有のバリデーション制約が含まれます。

アノテーションプロパティータイプランタイムチェックHibernate Metadata の影響

@Length(min=, max=)

文字列

文字列の長さが指定の範囲と一致するかを確認します。

カラムの長さを最大に設定します。

@CreditCardNumber

文字列

文字列が正規の形式のクレジットカード番号であるかどうかを確認します (Luhn アルゴリズムの派生)。

なし

@EAN

文字列

文字列が正しくフォーマットされた EAN あるいは UPC-A コードであるかを確認します。

なし

@Email

文字列

文字列がメールアドレスの仕様に準拠するかどうかを確認します。

なし

@NotEmpty

 

文字列が null あるいは空でないかを確認します。接続が null あるいは空でないかを確認します。

カラムは文字列の null ではありません。

@Range(min=, max=)

数値または数値の文字列表現

値が最小値以上で最大値以下であるかどうかを確認します。

カラムに check 制約を追加します。

14.3. バリデーション設定

Bean バリデーションは、/META-INF ディレクトリーにある validation.xml ファイル内の XML を使用して設定できます。このファイルがクラスパスに存在する場合は、ValidatorFactory が作成されたときに設定が適用されます。

バリデーション設定ファイルの例

以下の例は、validation.xml ファイルの複数の設定オプションを示しています。これらすべての設定はオプションです。これらのオプションは、javax.validation パッケージを使用して設定することもできます。

<validation-config xmlns="http://jboss.org/xml/ns/javax/validation/configuration"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/configuration">

    <default-provider>
        org.hibernate.validator.HibernateValidator
    </default-provider>
    <message-interpolator>
        org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator
    </message-interpolator>
    <constraint-validator-factory>
        org.hibernate.validator.engine.ConstraintValidatorFactoryImpl
    </constraint-validator-factory>

    <constraint-mapping>
        /constraints-example.xml
    </constraint-mapping>

    <property name="prop1">value1</property>
    <property name="prop2">value2</property>
</validation-config>

ノード default-provider では、Bean バリデーションプロバイダーを選択できます。これは、クラスパスに複数のプロバイダーがある場合に役に立ちます。message-interpolator プロパティーと constraint-validator-factory プロパティーは、javax.validation パッケージで定義されたインターフェース MessageInterpolator および ConstraintValidatorFactory の使用済み実装をカスタマイズするために使用されます。constraint-mapping 要素は、実際の制約設定が含まれる追加の XML ファイルをリストします。