第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 で制約アノテーションを作成するプロセスを説明します。
前提条件
- Red Hat JBoss Developer Studio で Java プロジェクトを開きます。
データセットを作成します。
制約アノテーションには、許容値を定義するデータセットが必要です。
- Project Explorer (プロジェクトエクスプローラー) パネルでプロジェクトルートフォルダーを右クリックします。
-
New
Enum を選択します。 以下の要素を設定してください。
- パッケージ:
- 名前:
- Add… ボタンをクリックして必要なインターフェースを追加します。
- Finish をクリックしてファイルを作成します。
- 値セットをデータセットに追加し、Save をクリックします。
データセットの例
package com.example; public enum CaseMode { UPPER, LOWER; }
アノテーションファイルを作成します。
新しい Java クラスを作成します。
制約アノテーションを設定し、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 の影響 |
---|---|---|---|
|
ブール値 |
メソッドが false と評価することを確認します (アノテーションでなくコードで制約が表現されている場合に便利です)。 |
なし |
|
ブール値 |
メソッドが true と評価することを確認します (アノテーションでなくコードで制約が表現されている場合に便利です)。 |
なし |
|
数値または数値の文字列表現 |
プロパティーが |
カラムの精度とスケールを定義します。 |
|
日付またはカレンダー |
未来の日付であるかを確認します。 |
なし |
|
数値または数値の文字列表現 |
値が最大値以下であるかを確認します。 |
カラムに check 制約を追加します。 |
|
数値または数値の文字列表現 |
値が最小値以上であるかを確認します。 |
カラムに check 制約を追加します。 |
|
値が null でないかを確認します。 |
カラムが null でないかを確認します。 | |
|
日付またはカレンダー |
過去の日付であるかを確認します。 |
カラムに check 制約を追加します。 |
|
文字列 |
プロパティーが一致フラグが指定された正規表現に一致するかどうかを確認します。 |
なし |
|
アレイ、コレクション、マップ |
要素サイズが最小値以上で最大値以下であるかどうかを確認します。 |
なし |
|
オブジェクト |
紐付けされたオブジェクトに再帰的にバリデーションを実行します。オブジェクトがコレクションかアレイの場合は、要素は再帰的に検証されます。また、オブジェクトがマップの場合、値要素が再帰的に検証されます。 |
なし |
パラメーター @Valid
は、javax.validation.constraints
パッケージに存在しますが Bean Validation 仕様の一部です。
Hibernate Validator 固有のバリデーション制約
以下の表には、org.hibernate.validator.constraints
パッケージに含まれるベンダー固有のバリデーション制約が含まれます。
アノテーション | プロパティータイプ | ランタイムチェック | Hibernate Metadata の影響 |
---|---|---|---|
|
文字列 |
文字列の長さが指定の範囲と一致するかを確認します。 |
カラムの長さを最大に設定します。 |
|
文字列 |
文字列が正規の形式のクレジットカード番号であるかどうかを確認します (Luhn アルゴリズムの派生)。 |
なし |
|
文字列 |
文字列が正しくフォーマットされた EAN あるいは UPC-A コードであるかを確認します。 |
なし |
|
文字列 |
文字列がメールアドレスの仕様に準拠するかどうかを確認します。 |
なし |
|
文字列が null あるいは空でないかを確認します。接続が null あるいは空でないかを確認します。 |
カラムは文字列の null ではありません。 | |
|
数値または数値の文字列表現 |
値が最小値以上で最大値以下であるかどうかを確認します。 |
カラムに 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 ファイルをリストします。