8. EJBを使用してデーターベースに値を追加し、Bean Validationで入力チェック

Bean ValidationはJava EE 6プラットフォームに追加された新たな仕様の1つです。この仕様では、予め用意されたいくつかの制約セットと入力値に対する拡張可能な制約機構を定義し、フィールド、メソッド、型、アノテーションに対して設定できる。Javaアプリケーション開発者が使用可能な入力チェックの手段も用意している。

この制約はJPAエンティティに対しても適用可能であり、エンティティのライフサイクルにおけるpersist、update、removeイベントの前に入力チェックが実行される。JSFのフォームバッキングBeanに対しても適用可能あり、フォームに入力されたデータを入力チェック対象にできる。

本セクションでは、EJBでデータベースに値を追加し、Bean Validationで自動的に入力チェックを行います。

  1. EJBに新しいメソッドを追加します。
public void addCustomer(Integer customerId,
        String name,
        Address address,
        String phone,
        String fax,
        String email,
        Integer creditLimit,
        DiscountCode discountCode) {
    Customer c = new Customer(customerId);
    c.setName(name);
    c.setAddress(address);
    c.setPhone(phone);
    c.setFax(fax);
    c.setCreditLimit(creditLimit);
    c.setDiscountCode(discountCode);
    em.persist(c);
}

このメソッドでは EntityManagerpersist メソッドでデータベースに新規顧客情報を追加するためにいくつかのパラメータを取ります。

DiscountCode はデフォルト値、 Address はデフォルト値の代わりに org.glassfish.samples.Address を選んで、importを解決してください。

  1. 次のコードを TestServletprocessRequest メソッドに追加します。
 String id = request.getParameter("add");
 if (id != null) {
     Address address = new Address();
     address.setAddressline1("4220, Network Circle");
     address.setCity("Santa Clara");
     address.setState("CA");
     MicroMarket zip = new MicroMarket();
     zip.setZipCode("95051");
     address.setZip(zip);
     bean.addCustomer(Integer.parseInt(id),
             "FLL Enterprises",
             address,
             "1234",
             "5678",
             "foo@bar.com",
             1000,
             new DiscountCode('H'));
     out.println("<h2>Customer with '" + Integer.parseInt(id) + "' id added.</h2>");
}

このコードフラグメントでは “add” パラメータをURLから取得し、EJBのメソッドを呼び、新規顧客をデータベースに登録します。顧客IDはパラメータから取得し、その他デフォルト値を使っています。

もう一回importを直します。``DiscountCode`` と DiscountCode はデフォルト値、 Addressorg.glassfish.samples.Address を選んでください。

3 ブラウザで “http://localhost:8080/JavaEE6SampleApp/TestServlet?add=4 にアクセスしてください。 新規顧客(この場合IDが4)がデータベースに登録され、次のようなページが表示されます。

新規で追加された顧客がリスト中に現れることに着目してください。出力結果は processRequest のどこにコードが足されたかによって異なるかもしれません。

顧客IDはURLで指定できるので、既にデータベースに存在しない番号を選ぶことが重要です。

Customer.java 上のBean Validationによる制約の1つが電話番号 ( phone フィールド)で、12文字を最大値としています。ここで、少なくとも7文字以上という制約を変更しましょう。これは既存の制約である、

@Size(max = 12)

から

@Size(min = 7, max = 12)

に変更すればよいです。ファイルを保存してください。プロジェクトが自動的に再デプロイされます。

5 ブラウザで “http://localhost:8080/JavaEE6SampleApp/TestServlet?add=5“ にアクセスしてください。 新規顧客をデータベースに登録しようとし、次のようなページが表示されます。

The output shows the “Access count” は1増加していますが顧客リストは表示されていません。代わりにGlassFishのログに次のメッセージが出力されています

Servlet内で設定される電話番号が4桁であり、入力チェックの仕様に合わないためにエラーメッセージが出力されます。電話番号を7桁に変えることで修正できます。

6 TestServlet.java を編集して, 電話番号を “1234” から “1234567”に変更してファイルを保存してください。 “http://localhost:8080/JavaEE6SampleApp/TestServlet?add=5” に再びアクセスすると次の画面が表示されます。

今度は顧客が無事追加されました。

Project Versions

前のトピックへ

7. サーブレットをリファクタリングし、EJBを使ってデーターベースに問い合わせ

次のトピックへ

9. JPA2のメタモデルを使用しタイプセーフなクライテリアクエリの実行

このページ