デベロッパー
デベロッパー
JSF 2.0のビーン検証と依存性の注入 (1/2)
データ検証は Java アプリケーションの各層であまりにも一般的な機能で、Java EE 6の一部であるJSR 303 - ビーン検証は、アプリケーション層とは独立した形でデータ検証の制約を定義するメカニズムを提供する。この JSR を使えば、アノテーションを使ってデータ検証の制約を指定できるようになる。
これらのアノテーションは、JavaBean の命名手法に従うものならどのフィールド、メソッド、あるいはクラスにでも配置することができる。制約を指定するには、標準のアノテーション(
以下の表は標準のビーン検証アノテーションを示している。
JavaServer Facesの新バージョンである JSF 2.0は、サーバのランタイム(Java EE 6)が要求すればビーン検証機能を内蔵でサポートする。これは、Java EE 6サーバが存在しない可能性のある環境で「Hibernate Validator」(JSR 303リファレンス実装)と一緒に使うこともできる。
管理されるビーンのプロパティはフォーム上の「
一例として、JSF 2.0カスタムコンポーネントを使って簡単なネットクイズ・アプリケーションの登録画面を作成したとする(詳しい方法についてはJSF 2.0: Creating Composite Componentsを参照)。ビーン検証の使い方を学ぶには、ネットクイズ・アプリケーションの登録画面の「
必須の制約は、「
ここで、コンポジットコンポーネントの「
ここではビーン検証サポートをテストすることができる。図1は、値を一切入力せずにフォームを送信したときのサンプル出力となっている。
図1 オンラインクイズアプリにおけるビーン検証サポートのテスト:値を一切入力せずにフォームを提出したときのサンプル出力
JSF 2は、確認グループを使えるようにする
これらのアノテーションは、JavaBean の命名手法に従うものならどのフィールド、メソッド、あるいはクラスにでも配置することができる。制約を指定するには、標準のアノテーション(
javax.validation.constraintsパッケージで定義されている)を使うか、もしくは自分独自のカスタムアノテーションを書くことができる。 以下の表は標準のビーン検証アノテーションを示している。
| ビーン検証アノテーション | アノテーション付きエレメントに対する制約 |
@NotNull |
null は不可 |
@Min |
指定された最小値以上の数字 |
@Max |
指定された最大値以下の数字 |
@Size |
指定された最小および最大限度の間 |
@Pattern |
指定された Java 正規表現と一致 |
JavaServer Facesの新バージョンである JSF 2.0は、サーバのランタイム(Java EE 6)が要求すればビーン検証機能を内蔵でサポートする。これは、Java EE 6サーバが存在しない可能性のある環境で「Hibernate Validator」(JSR 303リファレンス実装)と一緒に使うこともできる。
管理されるビーンのプロパティはフォーム上の「
UIInput」コンポーネントにマッピングされるので、その上に標準の検証制約を配置することができる。JSF のインプリメンテーションは「h:messages」や「h:message」を使って表示できるよう、コンポーネントの値に検証制約を適用し、すべてのエラーメッセージを「FacesMessage」としてキャプチャすることができる。 一例として、JSF 2.0カスタムコンポーネントを使って簡単なネットクイズ・アプリケーションの登録画面を作成したとする(詳しい方法についてはJSF 2.0: Creating Composite Componentsを参照)。ビーン検証の使い方を学ぶには、ネットクイズ・アプリケーションの登録画面の「
RegistrationBean」を作り直して以下のようにプロパティフィールドに検証制約を含めることになる。
@ManagedBean
@RequestScoped
public class RegisterBean2 {
@Size(min = 1, message = "Please enter the Email")
@Pattern(regexp = "[a-zA-Z0-9]+@[a-zA-Z0-9]+\\.[a-zA-Z0-9]+", message = "Email format is invalid.")
private String email;
@Size(min = 1, message = "Please enter a Username")
private String userName;
@Size(min = 1, max = 10, message = "Password is mandatory and cannot contain more than 10 characters")
private String password;
@Size(min = 1, message = "Enter password in Confirm Password field")
private String confirmPassword;
@NotNull(message = "Please enter Date of birth")
private Date dob;
//... no other change required
}
必須の制約は、「
dob」フィールドの場合と同じように「@NotNull」アノテーションを使って課すことができる。「email」、「username」、そして「password」の各フィールドでは、デフォルト値が空の文字列でヌルではないため、「@NotNull」を使うことはできない。したがって、「@NotNull」が使用されれば確認エラーは一切発生しない。その代わりに、「@Size」を使って下限を「1」に指定することができる。さらに、各制約アノテーションには「string」を受け付けるメッセージ要素がある。その値は、「FacesMessage」に変換され、「h:messages」や「h:message」を使ってレスポンス画面に表示されるエラーメッセージの作成に使用される。 ここで、コンポジットコンポーネントの「
register.xhtml」を修正することができる。必須のフィールド確認は、管理ビーンのプロパティに制約を課しているため削除することができる(required="true"を使って実施)。同様に、タグも以下のように削除することができる。
<h:outputText value="#{ cc.attrs.emailPrompt }"/>
<h:inputText id="email" value="#{ cc.attrs.managedBean.email }" >
<!--
<f:validateRegex pattern="[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+"/>
-->
</h:inputText>
ここではビーン検証サポートをテストすることができる。図1は、値を一切入力せずにフォームを送信したときのサンプル出力となっている。

図1 オンラインクイズアプリにおけるビーン検証サポートのテスト:値を一切入力せずにフォームを提出したときのサンプル出力
JSF 2は、確認グループを使えるようにする
タグも提供する。確認グループは制約のサブセットを定義するが、制約はそれぞれが最低1つのグループに属している。「validationGroups」属性を以下のように使うことで、コンポーネント確認中に考慮する確認グループを1つ以上指定することができる。
<h:inputText value="#{ bean.prop1}">
<f:validateBean validationGroups="com.demo.validation.groups.Group1"/>
</h:inputText>
New Topics
Special Ad
| “超高速無線 LAN 時代”の幕開け--新規格 11ac(Draft)に対応したバッファロー最新ルーターの潜在能力を試す | |
![]() |
バッファローは次世代無線 LAN 規格 IEEE802.11ac(Draft)通信速度最大 1,300Mbps 対応無線 LAN ルーター「WZR-1750DHP」を3月下旬に販売開始。今回、同機器を入手できたので、使用感や便利な機能についてレポートしたい。⇒詳細記事へ |
Hot Topics
IT Job
今週のIT求人情報
Interviews / Specials
Follow japan.internet.com
Popular
Access Ranking
Partner Sites










