ヘッダーをスキップ
Oracle SOA Suiteチュートリアル
10g (10.1.3.1.0)
B31831-01
  目次へ
目次

前へ
前へ
 
次へ
次へ
 

3 CustomerServiceプロジェクトの作成

この章では、CustomerServiceプロジェクトの作成方法について説明します。 項目は次のとおりです。

3.1 CustomerServiceプロジェクトの概要

CustomerServiceプロジェクトでは、SOADemo-Clientアプリケーションなどのクライアント・アプリケーションで、データベースから顧客情報を取得したり、顧客をデータベースに追加できるメソッドが提供されます。

CustomerServiceプロジェクトの特徴

3.2 CustomerService用の新規プロジェクトの作成

最初に、JDeveloperでCustomerService用の新規プロジェクトを作成します。手順は次のとおりです。

  1. 「SOADEMO」アプリケーションを右クリックし、「新規プロジェクト」を選択します。

  2. 新規ギャラリの「カテゴリ」セクションで、「General」を開き、「Projects」を選択します。 「項目」セクションで、「空のプロジェクト」を選択します。

    図3-1 CustomerServiceプロジェクト用の新規ギャラリ

    図3-1の説明は次にあります。
    「図3-1 CustomerServiceプロジェクト用の新規ギャラリ」の説明

    「OK」をクリックします。

  3. 「プロジェクトの作成」ダイアログで、「プロジェクト名」フィールドに「CustomerService」と入力します。

    図3-2 CustomerServiceプロジェクトに関する「プロジェクトの作成」ダイアログ

    図3-2の説明は次にあります。
    「図3-2 CustomerServiceプロジェクトに関する「プロジェクトの作成」ダイアログ」の説明

    「OK」をクリックします。

    アプリケーション・ナビゲータで、SOADEMOアプリケーションの下に空のCustomerServiceプロジェクトが表示されていることを確認します。

  4. 「ファイル」→「保存」の順に選択して、作業内容を保存します。

3.3 データベースの表からのエンティティBeanの作成

JDeveloperを使用すると、SOADEMOスキーマのCustomer表とAddress表に対してエンティティ・オブジェクトを生成できます。 これらのエンティティ・オブジェクトでは、EJB 3.0で使用可能なJava永続性APIを使用します。

エンティティBeanを生成する手順は、次のとおりです。

  1. 「CustomerService」プロジェクトを右クリックし、「新規」を選択します。 新規ギャラリの「カテゴリ」セクションで、Business Tierを開き、「EJB」を選択します。 「項目」セクションで、「表ベースのエンティティ(JPA/EJB 3.0)」を選択します。 「OK」をクリックします。

    図3-3 データベース表からエンティティ・オブジェクトを作成するための新規ギャラリ

    図3-3の説明は次にあります。
    「図3-3 データベース表からエンティティ・オブジェクトを作成するための新規ギャラリ」の説明

    エンティティ作成(表ベース)ウィザードが起動します。

  2. エンティティ作成(表ベース)ウィザードのようこそページで、「次へ」をクリックします。

  3. ステップ1のデータベース接続の詳細ページで、データベース接続を選択し、「次へ」をクリックします。

    図3-4 エンティティ作成(表ベース)ウィザード: ステップ1、データベース接続の詳細

    図3-4の説明は次にあります。
    「図3-4 エンティティ作成(表ベース)ウィザード: ステップ1、データベース接続の詳細」の説明

  4. ステップ2の表の選択ページで、次の項目を確認します。

    • 「名前フィルタ」が空白であること。

    • 「自動問合せ」が選択されていないこと。

    • 「スキーマ」がSOADEMOに設定されていること。

    • 「表」が選択されていること。

    図3-5 エンティティ作成(表ベース)ウィザード: ステップ2、表の選択

    図3-5の説明は次にあります。
    「図3-5 エンティティ作成(表ベース)ウィザード: ステップ2、表の選択」の説明

    「問合せ」をクリックします。 SOADEMOスキーマに表リストが表示されていることを確認します。

  5. 「Address」および「Customer」を選択し、青色の一重矢印をクリックして「選択済」ボックスに移動します。

    図3-6 エンティティ作成(表ベース)ウィザード: ステップ2、表の選択

    図3-6の説明は次にあります。
    「図3-6 エンティティ作成(表ベース)ウィザード: ステップ2、表の選択」の説明

    「次へ」をクリックします。

  6. ステップ3の表からのエンティティ・ページで、次の操作を実行します。

    • パッケージ名: 「org.soademo.customerservice.persistence」に設定します。

    • メンバーレベルの注釈を配置: 「フィールド」を選択します。

    • java.io.Serializableの実装: このオプションを選択します。

    • 関連フィールドのコレクション・タイプ: 「java.util.List」を選択します。

    図3-7 エンティティ作成(表ベース)ウィザード: ステップ3、表からのエンティティ

    図3-7の説明は次にあります。
    「図3-7 エンティティ作成(表ベース)ウィザード: ステップ3、表からのエンティティ」の説明

    「次へ」をクリックします。

  7. ステップ4のエンティティの詳細を指定ページで、次の操作を実行します。

    「表名」で、「SOADEMO.ADDRESS」を選択します。

    • エンティティ名: Address

    • Beanクラス: org.soademo.customerservice.persistence.Address

    図3-8 Address表の値が表示されたエンティティ作成(表ベース)ウィザード: ステップ4、エンティティの詳細を指定

    図3-8の説明は次にあります。
    「図3-8 Address表の値が表示されたエンティティ作成(表ベース)ウィザード: ステップ4、エンティティの詳細を指定」の説明

    「表名」で、「SOADEMO.CUSTOMER」を選択します。

    • エンティティ名: Customer

    • Beanクラス: org.soademo.customerservice.persistence.Customer

    図3-9 Customer表の値が表示されたエンティティ作成(表ベース)ウィザード: ステップ4、エンティティの詳細を指定

    図3-9の説明は次にあります。
    「図3-9 Customer表の値が表示されたエンティティ作成(表ベース)ウィザード: ステップ4、エンティティの詳細を指定」の説明

    「次へ」をクリックします。

  8. 「サマリー」画面で、「終了」をクリックします。

  9. 「ファイル」→「保存」の順に選択して、作業内容を保存します。

次のファイルが表示されていることを確認します。

SOADEMOは、SOADEMOアプリケーションを作成したディレクトリを表します。

アプリケーション・ナビゲータは次のように表示されます。

図3-10 作成したファイルが表示されたアプリケーション・ナビゲータ

図3-10の説明は次にあります。
「図3-10 作成したファイルが表示されたアプリケーション・ナビゲータ」の説明

3.4persistence.xmlの編集

CustomerService¥src¥META-INF¥persistence.xmlで、次の操作を実行します。

JDeveloperのプロパティ・ダイアログを使用すると、次の変更を実行できます。

  1. CustomerServiceプロジェクトでの変更をすべて保存したことを確認します。 アプリケーション・ナビゲータにイタリック体で表示される項目がある場合は、その項目を選択し、「ファイル」→「保存」の順に選択します。

  2. 「表示」→「構造」の順に選択し、構造ウィンドウを表示します。

  3. アプリケーション・ナビゲータで「persistence.xml」を選択します。 構造ウィンドウで、ファイルの構造が表示されていることを確認します。

    図3-11 persistence.xmlの構造が表示された構造ウィンドウ(アプリケーション・ナビゲータの下)

    図3-11の説明は次にあります。
    「図3-11 persistence.xmlの構造が表示された構造ウィンドウ(アプリケーション・ナビゲータの下)」の説明

  4. 構造ウィンドウで、「persistence-unit」をダブルクリックします。 「persistence-unitのプロパティ」ダイアログが表示されます。

  5. 「persistence-unitのプロパティ」ダイアログで、次の操作を実行します。

  6. 「OK」をクリックします。 「persistence.xml」ファイルがアプリケーション・ナビゲータにイタリック体で表示されます。これは、保存されていない変更があることを示します。

  7. アプリケーション・ナビゲータで、「persistence.xml」ファイルをダブルクリックします。 エディタにファイルの内容が表示されます。

    ファイルの内容が次のように表示されていることを確認します。

    例3-1 persistence.xml

    <?xml version="1.0" encoding="windows-1252" ?>
    <persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
         http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
         xmlns="http://java.sun.com/xml/ns/persistence">
      <persistence-unit name="customerServiceUnit">
        <jta-data-source>jdbc/soademoDS</jta-data-source>
      </persistence-unit>
    </persistence>
    
    
  8. 「ファイル」→「保存」の順に選択し、ファイルを保存します。

  9. エディタでファイルを閉じます。

3.5 businessディレクトリでのセッションBeanの作成

businessディレクトリには、クライアントが使用できるメソッドを定義するためのセッションBeanを作成します。

セッションBeanを作成する手順は、次のとおりです。

  1. 「CustomerService」プロジェクトを右クリックし、「新規」を選択します。 新規ギャラリの「カテゴリ」セクションで、Business Tierを開き、「EJB」を選択します。 「項目」セクションで、「セッションBean(EJB 1.1/2.x/3.0)」を選択します。 「OK」をクリックします。

    図3-13 セッションBeanを作成するための新規ギャラリ

    図3-13の説明は次にあります。
    「図3-13 セッションBeanを作成するための新規ギャラリ」の説明

    セッションBean作成ウィザードが起動します。

  2. セッションBean作成ウィザードのようこそページで、「次へ」をクリックします。

  3. ステップ1のEJBの名前とオプション・ページで、次の操作を実行します。

    • EJB名: 「CustomerService」と入力します。

    • セッション・タイプ: 「ステートレス」を選択します。

    • トランザクション・タイプ: 「コンテナ」を選択します。

    • セッション・ファサード・メソッドの生成: このオプションを選択します。

    • エンティティの実装: 「EJB 3.0エンティティ」を選択します。

    • 永続性ユニット: 「customerServiceUnit (CustomerService.jpr)」を選択します。

      図3-14 セッションBean作成ウィザード: ステップ1、EJBの名前とオプション

      図3-14の説明は次にあります。
      「図3-14 セッションBean作成ウィザード: ステップ1、EJBの名前とオプション」の説明

      「次へ」をクリックします。

  4. ステップ2のセッション・ファサード -- EJB 3.0エンティティ・メソッドの選択ページで、すべての選択を解除します。

    Customerエンティティのメソッドは後で生成します。

    図3-15 セッションBean作成ウィザード: ステップ2、セッション・ファサード -- EJB 3.0エンティティ・メソッドの選択

    図3-15の説明は次にあります。
    「図3-15 セッションBean作成ウィザード: ステップ2、セッション・ファサード -- EJB 3.0エンティティ・メソッドの選択」の説明

    「次へ」をクリックします。

  5. ステップ3のクラス定義ページで、次の操作を実行します。

    • Beanクラス: 「org.soademo.customerservice.business.CustomerServiceBean」と入力します。

    • ソース・ディレクトリ: デフォルト(CustomerService¥srcディレクトリ)をそのまま使用します。

    図3-16 セッションBean作成ウィザード: ステップ3、クラス定義

    図3-16の説明は次にあります。
    「図3-16 セッションBean作成ウィザード: ステップ3、クラス定義」の説明

    「次へ」をクリックします。

  6. ステップ4のEJBコンポーネント・インタフェース・ページで、次の操作を実行します。

    • リモート・インタフェースの実装: このオプションを選択します。

    • リモート・インタフェース: org.soademo.customerservice.business.CustomerServiceRemote


      注意:

      リモート・インタフェースの名前は、デフォルト値と異なります。

    • ローカル・インタフェースの実装: このオプションを選択します。

    • ローカル・インタフェース: org.soademo.customerservice.business.CustomerServiceLocal

    • Webサービス・エンドポイント・インタフェースを含める: このオプションを選択します。

    • Webサービス・エンドポイント・インタフェース: org.soademo.customerservice.business.CustomerService


      注意:

      Webサービス・エンドポイント・インタフェースの名前は、デフォルト値と異なります。

      「Webサービス・エンドポイント・インタフェースを含める」オプションを選択すると、JSR-181ライブラリがプロジェクトに追加されることに注意してください。 このライブラリは、プロジェクトのコンパイルで必要です。 このライブラリは、後でプロジェクトに追加することもできます(追加されていない場合)。

      生成されたWSDLでは、Webサービス・エンドポイント・インタフェースの名前(CustomerService)がメッセージ名の接頭辞として使用されます。 また、この名前はポート・タイプの名前としても使用されます。 このことは、SOAOrderBookingプロジェクトに影響を与えるため、考慮する必要があります。 SOAOrderBooking¥bpelディレクトリのCustomerSvc.wsdlファイルでは、ポート・タイプの名前としてCustomerServiceが指定されます。 CustomerSvc.wsdlファイルのポート・タイプ名は、生成されたCustomerService WSDLのポート・タイプ名と一致している必要があります。 第3.13項「CustomerServiceに対するWSDLの表示」で説明するように、生成されたWSDLは、CustomerServiceプロジェクトをデプロイした後に表示できます。

    図3-17 セッションBean作成ウィザード: ステップ4、EJBコンポーネント・インタフェース

    図3-17の説明は次にあります。
    「図3-17 セッションBean作成ウィザード: ステップ4、EJBコンポーネント・インタフェース」の説明

    「次へ」をクリックします。

  7. サマリー・ページで、「終了」をクリックします。

  8. アプリケーション・ナビゲータで「CustomerService」を選択し、「ファイル」→「保存」の順に選択して作業内容を保存します。

  9. JDeveloperのエディタに、CustomerServiceBean.javaファイルが表示されます。 このファイルは、閉じることができます。

アプリケーション・ナビゲータで、businessディレクトリにCustomerServiceセッションBeanが表示されていることを確認します。

図3-18 businessディレクトリにCustomerServiceセッションBeanが表示されたアプリケーション・ナビゲータ

図3-18の説明は次にあります。
「図3-18 businessディレクトリにCustomerServiceセッションBeanが表示されたアプリケーション・ナビゲータ」の説明

3.6 Customer.javaでの追加問合せの定義

追加の問合せおよび表情報を定義するには、CustomerService¥src¥org¥soademo¥customerservice¥persistenceディレクトリにあるCustomer.javaファイルを編集します。

CustomerServiceプロジェクトをデプロイすると、Oracle Application Serverでは、問合せを定義する注釈を使用して、そのプロジェクトに対するWSDLが生成されます。これによって、クライアントはプロジェクトにWebサービスとしてアクセスできます。 このWSDLはOracle Application Serverで生成され、その内容は、CustomerServiceプロジェクトのデプロイ後に表示できます。 第3.13項「CustomerServiceに対するWSDLの表示」を参照してください。

Customer.javaファイルを次のように編集します。

例3-2 Customer.java

package org.soademo.customerservice.persistence;

import java.io.Serializable;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.TableGenerator;


// Note that the query statements between the double quotes must be on one line.

@Entity
@NamedQueries( { @NamedQuery(name = "Customer.findAllCustomer",
                 query = "select object(o) from Customer o")
        ,
        @NamedQuery(name = "Customer.findCustomerById",
     query = "select object(cust) from Customer cust where cust.custid = :custid")
        ,
        @NamedQuery(name = "Customer.findCustomerByEmail",
 query = "select object(cust) from Customer cust where cust.email = :email and
 cust.password = :password")
        } )

@Table(name = "CUSTOMER")
@SequenceGenerator(name = "SEQ_ID_GENERATOR", sequenceName = "EJB_SEQ_ID_GEN")
@TableGenerator(name = "TABLE_ID_GENERATOR", table = "EJB_TAB_ID_GEN",
                pkColumnName = "ID_NAME", valueColumnName = "SEQ_VALUE",
                pkColumnValue = "SEQ_GEN")
public class Customer implements Serializable {
    private String creditcardnumber;
    private String creditcardtype;
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE,
                    generator = "TABLE_ID_GENERATOR")
    @Column(nullable = false)
    private String custid;
    private String email;
    private String fname;
    private String lname;
    private String phonenumber;
    private String status;
    private String password;

    @OneToMany(fetch = FetchType.LAZY, cascade = { CascadeType.ALL } )
    @JoinTable(name = "CUSTOMER_ADDRESS",
               joinColumns = { @JoinColumn(name = "CUSTID")
                } , inverseJoinColumns = { @JoinColumn(name = "ADDRESSID")
                } )
    private List<Address> addressList;

    public Customer() {
    }

    public String getCreditcardnumber() {
        return creditcardnumber;
    }

    public void setCreditcardnumber(String creditcardnumber) {
        this.creditcardnumber = creditcardnumber;
    }

    public String getCreditcardtype() {
        return creditcardtype;
    }

    public void setCreditcardtype(String creditcardtype) {
        this.creditcardtype = creditcardtype;
    }

    public String getCustid() {
        return custid;
    }

    public void setCustid(String custid) {
        this.custid = custid;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getFname() {
        return fname;
    }

    public void setFname(String fname) {
        this.fname = fname;
    }

    public String getLname() {
        return lname;
    }

    public void setLname(String lname) {
        this.lname = lname;
    }

    public String getPhonenumber() {
        return phonenumber;
    }

    public void setPhonenumber(String phonenumber) {
        this.phonenumber = phonenumber;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public List<Address> getAddressList() {
        if (addressList == null) {
            addressList = new ArrayList();
        }
        return addressList;
    }

    public void setAddressList(List<Address> addressList) {
        this.addressList = addressList;
    }

    public Address addAddress(Address address) {
        getAddressList().add(address);
        return address;
    }

    public Address removeAddress(Address address) {
        getAddressList().remove(address);
        return address;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPassword() {
        return password;
    }
}

3.7 データベース順序を使用したAddress.javaでのアドレスIDの生成

ADDRESS_EJB_SEQ_ID_GENというデータベース順序を使用してアドレスIDを生成するように、Address.javaを編集します。

太字の行は変更が必要です。 ファイル内の他の行は同じままにします。

package org.soademo.customerservice.persistence;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQuery;

// add these import lines
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

@Entity
@NamedQuery(name = "Address.findAllAddress",
            query = "select object(o) from Address o")
@Table(name = "ADDRESS")
public class Address implements Serializable {
    private String addresstype;
    @Id
    @SequenceGenerator(name = "ADDRESS_ID_GEN",
                       sequenceName = "ADDRESS_EJB_SEQ_ID_GEN")
    @GeneratedValue(strategy = GenerationType.SEQUENCE,
                    generator = "ADDRESS_ID_GEN")
    @Column(nullable = false)
    private String addrid;
    private String city;
    private String country;
    private String state;
    private String street;
    private String zip;
...

3.8 セッションBean(CustomerServiceBean.java)に対するセッション・ファサードの編集

前の項(第3.6項「Customer.javaでの追加問合せの定義」)でCustomer.javaファイルの問合せを使用して定義したメソッドを追加するには、CustomerService¥src¥org¥soademo¥customerservice¥businessディレクトリにあるCustomerServiceBean.javaを編集します。

新規メソッドをCustomerServiceBean.javaに追加する手順は、次のとおりです。

  1. 「CustomerServiceBean.java」を右クリックして、「セッション・ファサードの編集」を選択します。 「セッション・ファサード・オプションの指定」ダイアログが表示されます。

  2. このダイアログで「Customer」を開き、次のメソッドを選択します。

    • findCustomerById

    • findCustomerByEmail

    他のメソッドは、SOA Order Bookingアプリケーションでは使用しないため、選択する必要はありません。

    図3-19 「セッション・ファサード・オプションの指定」ダイアログ

    図3-19の説明は次にあります。
    「図3-19 「セッション・ファサード・オプションの指定」ダイアログ」の説明

  3. 「OK」をクリックします。 JDeveloperでは、選択したメソッドを含むようにCustomerServiceBean.javaが変更されます。

  4. JDeveloperのエディタに、CustomerServiceBean.javaが表示されます。 「ファイル」→「保存」の順に選択して、このファイルを保存します。ただし、編集を行うため閉じないでください。

3.9 セッションBean(CustomerServiceBean.java)でのメソッドの追加と変更

CustomerServiceBean.javaに対して、次の変更を行います。

3.9.1 queryCustomerFindCustomerByIdの変更

queryCustomerFindCustomerByIdメソッドを次のように変更します。

  • リストではなく単一の値を戻すように変更します。

  • 名前を「findCustomerById」に変更します。

ファイルを直接編集することもできますが、JDeveloperのプロパティ・ダイアログを使用して変更することをお薦めします。これは、このクラスが実装されているインタフェース・ファイル(CustomerServiceRemote.javaCustomerServiceLocal.javaおよびCustomerService.java)などの他のファイルで変更が同期化されるためです。

  1. CustomerServiceBean.javaがエディタに表示されていない場合は、アプリケーション・ナビゲータでダブルクリックします。

  2. 「表示」→「構造」の順に選択し、構造ウィンドウを表示します。

  3. アプリケーション・ナビゲータで「CustomerServiceBean.java」を選択します。

  4. 構造ウィンドウで、「queryCustomerFindCustomerById」メソッドを右クリックし、「プロパティ」を選択します。 「Beanメソッドの詳細」ダイアログが表示されます。

  5. 「Beanメソッドの詳細」ダイアログで、次の操作を実行します。

    • 名前: 「findCustomerById」に変更します。

    • 戻り型: 「java.util.List」と山カッコを削除します。これによって、完全なパッケージ名(org.soademo.customerservice.persistence.Customer)で指定された顧客のみ戻されます。

    • パラメータ: 「Object」「String」に変更します。

    ダイアログが次のように表示されていることを確認します。

    図3-20 findCustomerByIdに関する「Beanメソッドの詳細」ダイアログ

    図3-20の説明は次にあります。
    「図3-20 findCustomerByIdに関する「Beanメソッドの詳細」ダイアログ」の説明

  6. 「OK」をクリックします。 エディタに変更が表示されます。

  7. エディタで、findCustomerByIdメソッドに対して次の変更を行います。

    • 戻り値をCustomerにキャストします。

    • 最後のメソッドをgetSingleResultgetResultListではなく)に変更します。

    例3-3に、更新されたメソッドを示します。

    例3-3 更新されたfindCustomerById

    public Customer findCustomerById(String custid) {
       return (Customer)em.createNamedQuery("Customer.findCustomerById").
                          setParameter("custid", custid).getSingleResult();
    }
    
    
  8. 「ファイル」→「保存」の順に選択し、変更内容を保存します。

  9. 構造ウィンドウで、「ソース」を開きます。 「ソース」の下にインタフェース・ファイルがリストされていることを確認します。

  10. インタフェース・ファイル(「CustomerServiceRemote.java」、「CustomerServiceLocal.java」および「CustomerService.java」)をそれぞれダブルクリックして、その内容をエディタに表示します。 インタフェース・ファイルは、構造ウィンドウの「ソース」の下にリストされています。

    インタフェース・ファイルをダブルクリックした後は、アプリケーション・ナビゲータで「CustomerServiceBean.java」を再度選択する必要があります。 インタフェース・ファイルがCustomerServiceBean.javaのソースとしてリストされます。

    JDeveloperでは、ユーザーによる更新と同期化するために、これらのインタフェース・ファイル内のメソッドが更新されていることに注意してください。

    図3-21 CustomerServiceBean.javaの構造が表示されたアプリケーション・ナビゲータと構造ウィンドウ

    図3-21の説明は次にあります。
    「図3-21 CustomerServiceBean.javaの構造が表示されたアプリケーション・ナビゲータと構造ウィンドウ」の説明

  11. インタフェース・ファイルを保存します。

3.9.2 queryCustomerFindCustomerByEmailの変更

queryCustomerFindCustomerByIdメソッドに対する変更と同様に、queryCustomerFindCustomerByEmailメソッドを次のように変更します。

  • リストではなく単一の値を戻すように変更します。

  • 名前を「findCustomerByEmail」に変更します。

ファイルを直接編集することもできますが、JDeveloperのプロパティ・ダイアログを使用して変更することをお薦めします。これは、このクラスが実装されているインタフェース・ファイル(CustomerServiceRemote.javaCustomerServiceLocal.javaおよびCustomerService.java)などの他のファイルで変更が同期化されるためです。

  1. アプリケーション・ナビゲータで「CustomerServiceBean.java」を選択します。

  2. 構造ウィンドウで、「queryCustomerFindCustomerByEmail」メソッドを右クリックし、「プロパティ」を選択します。 「Beanメソッドの詳細」ダイアログが表示されます。

  3. 「Beanメソッドの詳細」ダイアログで、次の操作を実行します。

    • 名前: 「findCustomerByEmail」に変更します。

    • 戻り型: 「java.util.List」と山カッコを削除します。これによって、完全なパッケージ名(org.soademo.customerservice.persistence.Customer)で指定された顧客のみ戻されます。

    • パラメータ: 両方のパラメータについて、「Object」「String」に変更します。

    ダイアログが次のように表示されていることを確認します。

    図3-22 findCustomerByEmailに関する「Beanメソッドの詳細」ダイアログ

    図3-22の説明は次にあります。
    「図3-22 findCustomerByEmailに関する「Beanメソッドの詳細」ダイアログ」の説明

  4. 「OK」をクリックします。 エディタに変更が表示されます。

  5. エディタで、findCustomerByEmailメソッドに対して次の変更を行います。

    • 戻り値をCustomerにキャストします。

    • 最後のメソッドをgetSingleResultgetResultListではなく)に変更します。

    例3-4に、更新されたメソッドを示します。

    例3-4 更新されたfindCustomerByEmail

    public Customer findCustomerByEmail(String email, String password) {
       return (Customer)em.createNamedQuery("Customer.findCustomerByEmail").
                     setParameter("email", email).setParameter("password",password).
                     getSingleResult();
    }
    
    
  6. 「ファイル」→「保存」の順に選択し、変更内容を保存します。

  7. 構造ウィンドウで「ソース」を開き、インタフェース・ファイル(「CustomerServiceRemote.java」、「CustomerServiceLocal.java」および「CustomerService.java」)をそれぞれダブルクリックして、その内容をエディタに表示します。 JDeveloperでは、ユーザーによる更新と同期化するために、これらのファイル内のメソッドが更新されていることに注意してください。

  8. インタフェース・ファイルを保存します。

3.9.3 getCustomerStatusおよびaddNewCustomerメソッドの追加

getCustomerStatusおよびaddNewCustomerメソッドをCustomerServiceBean.javaに追加します。 これらのメソッドはエディタを使用して追加することもできますが、「Beanメソッドの詳細」ダイアログを使用して入力することをお薦めします。これは、新規メソッドにあわせてインタフェース・ファイルも更新されるためです。

新規メソッドを作成する手順は、次のとおりです。

  1. エディタにCustomerServiceBean.javaを表示します。

  2. 「表示」→「構造」の順に選択し、構造ウィンドウを表示します(表示されていない場合)。

  3. 構造ウィンドウで「メソッド」を右クリックし、「新規メソッド」を選択します。 「Beanメソッドの詳細」ダイアログが表示されます。

  4. 「Beanメソッドの詳細」ダイアログで、次の操作を実行します。

    • 名前: 「getCustomerStatus」と入力します。

    • 戻り型: 「java.lang.String」を選択します。

    • パラメータ: 「String CustomerID」と入力します。

    ダイアログが次のように表示されていることを確認します。

    図3-23 getCustomerStatusに関する「Beanメソッドの詳細」ダイアログ

    図3-23の説明は次にあります。
    「図3-23 getCustomerStatusに関する「Beanメソッドの詳細」ダイアログ」の説明

  5. 「OK」をクリックします。

  6. CustomerServiceBean.javaのエディタで、メソッドの本文を入力します。 例3-5を参照してください。

    例3-5 getCustomerStatus

    public String getCustomerStatus(String CustomerID) {
       return findCustomerById(CustomerID).getStatus();
    }
    
    
  7. ファイルを保存します。

    JDeveloperでは、この新規メソッドにあわせてインタフェース・ファイルが更新されることに注意してください。

  8. 同じ手順を繰り返して、addNewCustomerメソッドを作成します。 「Beanメソッドの詳細」ダイアログで、次の値を入力します。

    • 名前: 「addNewCustomer」と入力します。

    • 戻り型: 「java.lang.String」を選択します。

    • パラメータ: 「Customer customer」と入力します。

    ダイアログが次のように表示されていることを確認します。

    図3-24 addNewCustomerに関する「Beanメソッドの詳細」ダイアログ

    図3-24の説明は次にあります。
    「図3-24 addNewCustomerに関する「Beanメソッドの詳細」ダイアログ」の説明

  9. ダイアログで「OK」をクリックします。

  10. CustomerServiceBean.javaのエディタで、メソッドの本文を追加します。

    例3-6 addNewCustomer

    public String addNewCustomer(Customer customer) {
       em.persist(customer);
       return "New customer added sucessfully to customer database";
    }
    
    
  11. CustomerServiceBean.javaファイルを保存します。

  12. インタフェース・ファイルを保存します。

3.10 Webサービス・エンドポイント・インタフェース(CustomerService.java)へのJSR-181注釈の追加

CustomerService.javaファイルは、CustomerServiceセッションBeanのWebサービス・エンドポイント・インタフェースとして生成されています。 JSR-181注釈をこのファイルに追加して、メソッドおよびパラメータの名前を調整します。

ファイルを次のように編集します。 ファイルはエディタで変更できます。

例3-7 CustomerService.java

package org.soademo.customerservice.business;

import java.rmi.RemoteException;

import javax.ejb.Remote;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

import org.soademo.customerservice.persistence.Customer;

@WebService(serviceName = "CustomerSvc",
            targetNamespace = "http://www.globalcompany.com/ns/customer")
public interface CustomerService {

    @WebMethod
    Customer findCustomerById(
           @WebParam(name = "custid",
                     targetNamespace = "http://www.globalcompany.com/ns/customer")
                String custid) throws RemoteException;

    @WebMethod
    String getCustomerStatus(
           @WebParam(name = "CustomerID",
                     targetNamespace = "http://www.globalcompany.com/ns/customer")
                String CustomerID);

    @WebMethod
    String addNewCustomer(
           @WebParam(name = "customer",
                     targetNamespace = "http://www.globalcompany.com/ns/customer")
                Customer customer);

    @WebMethod
    Customer findCustomerByEmail(
           @WebParam(name = "email",
                     targetNamespace = "http://www.globalcompany.com/ns/customer")
                String email,
           @WebParam(name = "password",
                     targetNamespace = "http://www.globalcompany.com/ns/customer")
                String password);
}

3.11 CustomerServiceプロジェクトに対するEJB JARデプロイメント・プロファイルの作成

CustomerServiceプロジェクトをJDeveloperからOracle Application Serverに簡単にデプロイできるように、デプロイメント・プロファイルを作成します。

デプロイメント・プロファイルを作成する手順は、次のとおりです。

  1. 「CustomerService」プロジェクトを右クリックし、「新規」を選択します。 「カテゴリ」で、「General」を開き、「Deployment Profiles」を選択します。 「項目」で、「EJB JARファイル」を選択します。

    図3-25 EJB JARファイルに対するデプロイメント・プロファイルを作成するための新規ギャラリ

    図3-25の説明は次にあります。
    「図3-25 EJB JARファイルに対するデプロイメント・プロファイルを作成するための新規ギャラリ」の説明

    「OK」をクリックします。

  2. 「デプロイメント・プロファイルの作成 -- EJB JARファイル」ダイアログで、次の操作を実行します。

  3. 「EJB JARデプロイメント・プロファイルのプロパティ」ダイアログで、デフォルトをそのまま使用します。

    図3-27 「EJB JARデプロイメント・プロファイルのプロパティ」ダイアログ

    図3-27の説明は次にあります。
    「図3-27 「EJB JARデプロイメント・プロファイルのプロパティ」ダイアログ」の説明

  4. 「OK」をクリックします。

アプリケーション・ナビゲータの「リソース」の下にCustomerService.deployが表示されていることを確認します。

図3-28 CustomerService.deployデプロイメント・プロファイルが表示されたアプリケーション・ナビゲータ

図3-28の説明は次にあります。
「図3-28 CustomerService.deployデプロイメント・プロファイルが表示されたアプリケーション・ナビゲータ」の説明

3.12 CustomerServiceのデプロイ

  1. CustomerServiceプロジェクトをデプロイするには、アプリケーション・ナビゲータで「CustomerService.deploy」を右クリックし、「配布先」「SoademoApplicationServer」の順に選択します。SoademoApplicationServerは、Oracle Application Serverへの接続を指定します。

    JDeveloperでは、アプリケーションがコンパイルされ、CustomerService¥deployディレクトリにJARファイルとEARファイルが作成されます。 エラーがない場合は、「アプリケーションの構成」ダイアログが表示されます。

    図3-29 「アプリケーションの構成」ダイアログ

    図3-29の説明は次にあります。
    「図3-29 「アプリケーションの構成」ダイアログ」の説明

  2. 「OK」をクリックします。

JDeveloperのログ領域で、エラーに関するメッセージを確認します。

3.13 CustomerServiceに対するWSDLの表示

CustomerServiceに対するWSDLは、次のURLをブラウザに入力して表示できます。

http://hostname:port/CustomerService/CustomerService?WSDL

hostnameには、Oracle Application Serverが実行されているマシンの名前を入力します。

portには、Oracle HTTP ServerまたはOC4JがリスニングしているHTTPポートを入力します。 デフォルト・ポートは8888です。

CustomerServiceをデプロイした後は、Application Server ControlのOC4J: ホーム・ページの「Webサービス」タブ(図3-30)と「アプリケーション」タブ(図3-31)に、CustomerServiceが表示されていることを確認します。

図3-30 CustomerService Webサービスが表示されたOC4J: ホーム・ページの「Webサービス」タブ

図3-30の説明は次にあります。
「図3-30 CustomerService Webサービスが表示されたOC4J: ホーム・ページの「Webサービス」タブ」の説明

図3-31 CustomerServiceアプリケーションが表示されたOC4J: ホーム・ページの「アプリケーション」タブ

図3-31の説明は次にあります。
「図3-31 CustomerServiceアプリケーションが表示されたOC4J: ホーム・ページの「アプリケーション」タブ」の説明