デベロッパー

デベロッパー

JSF 2.0のビーン検証と依存性の注入 (1/2)

Sangeetha S, Nitin KL, Ananya S
2010年8月10日 / 10:00
 
 
データ検証は Java アプリケーションの各層であまりにも一般的な機能で、Java EE 6の一部であるJSR 303 - ビーン検証は、アプリケーション層とは独立した形でデータ検証の制約を定義するメカニズムを提供する。この JSR を使えば、アノテーションを使ってデータ検証の制約を指定できるようになる。

これらのアノテーションは、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>
【関連記事】
Java Web サービスで Restlet ルーティングシステムを活用する
日本オラクル、Java VM「Oracle JRockit」最新版で障害対応機能を追加
Sun から Java EE 6、Glassfish v3、NetBeans 6.8が正式に登場
Flash Builder と LiveCycle Data Services を使って Java ベースのアプリケーションをオフラインに置く
日本 IBM、「IBM WebSphere Application Server」の2オプションを無償で配布

New Topics

Special Ad

ゆりかごからロケットまで、すべての乗り物をエンジョイ
ゆりかごからロケットまで、すべての乗り物をエンジョイ えん乗り」は、ゆりかごからロケットまで、すべての乗り物をエンジョイする、ニュース、コラム、動画などをお届けします! てんこ盛りをエンジョイするのは こちらから

Hot Topics

IT Job

Interviews / Specials

Popular

Access Ranking

Partner Sites