How-To: Spring BeanでのEJB 3.0 Session Beanの使用

日付:2006年7月6日
著者:Debu Panda

はじめに

このサンプル・アプリケーションでは、Spring BeanからのEJB 3.0 Session Beanの使用について説明します。 ここでは、JPAを使用してエンティティを維持するEJB 3.0 Session Bean( EmployeeFacade EJB)を使用します。 EJB 3.0 Session Beanは、Spring Bean( EmployeeFacadeServiceBean)に注入されます。 Webモジュールは、Spring Beanを使用してエンティティ・インスタンスを維持します。 ここでは、EJB 3.0の宣言トランザクションが使用されます。 簡素化のため、サーブレット( InsertServlet)をコントローラとして使用し、サーブレットは EmployeeServiceFacadeBeanを使用します。

EJB 3.0によるステートレスBeanサンプル

 

このデモのSession Beanサンプルでは、JPAを使用して簡単なエンティティ・クラスを操作します。 ステートレスSession Beanのサンプル・コードを次に示します。

                                   
@Stateless
public class EmployeeFacadeBean  implements EmployeeFacade {
@PersistenceContext
   private EntityManager em;

      public Employee addEmployee(String empName, double sal) {
         Employee emp = new Employee();
         emp.setName(empName);
         emp.setSal(sal);
         em.persist(emp);
         return emp;
      }

  public Employee findEmployeeByEmpNo(Long empNo){
      return em.find(Employee.class,empNo);
}

}

                                

エンティティ・クラスは、エンティティであることを示す @Entityで注釈される簡単なJavaクラスです。

@Entity
@Table(name = "EMPLOYEES")
public class Employee implements java.io.Serializable
{
  private Long empNo;
  private String name;
  private double sal;

  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  @Column(name="EMPNO")
  public Long getEmpNo()
  {
    return empNo;
  }

..

}

エンティティは、persistence.xmlとして howtoという永続性ユニットで構成されます。永続性ユニットはJNDIの場所が jdbc/OracleDSにあるデータソースを使用します。

  
                                  
<persistence-unit name="howto">
                                    
<jta-data-source>jdbc/OracleDS</jta-data-source>
<properties>
<property name = "toplink.ddl-generation"
value = "create-tables"/>
<property name = "toplink.ddl-generation.output-mode" value = "database"/>
</properties>
</persistence-unit>
</persistence>

EJB 3.0ステートレスSession Beanの使用


EJB 3.0はPOJOベースのため、JNDIからアクセスしてSpringから直接使用します。 インタフェースはすでにビジネス・インタフェースであるため、EJB 2.1 Session Beanとは異なり、EJBに別のビジネス・インタフェースを作成する必要はありません。 また、Springのプロキシ・クラスの追加も不要です。

 

サーブレットから使用されるSpring Beanから、EmployeeFacade EJBを使用します。 EmployeeFacade EJB を使用するSpring Beanのコードを次に示します。

                                   
public class EmployeeFacadeServiceBean implements EmployeeFacadeService  {

protected EmployeeFacade employeeFacade ;
                                
//Uses setter injection    
  public void setEmployeeFacade(EmployeeFacade employeeFacade) {
     this.employeeFacade = employeeFacade;
  }


   public Employee addEmployee(String empName, Double sal){
       return (Employee) this.employeeFacade.addEmployee(empName, sal);   
   }

    public Employee findEmployeeByEmpNo(Long empNo) {
       return (Employee) this.employeeFacade.findEmployeeByEmpNo(empNo);
    }

}


                                

InsertServletはSpring Bean(EmployeeFacadeServiceBean)を使用します。

                                   
@EJB(name="ejb/EmployeeFacade",beanInterface=oracle.ejb30.EmployeeFacade.class)
public class InsertServlet extends HttpServlet 
{

  public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
  {
    ..
            EmployeeFacadeServiceBean es = (EmployeeFacadeServiceBean) appContext.getBean("employeeFacadeService");
            Employee emp = es.addEmployee(name,sal);
            System.out.println("Successfully persisted an employee");

   
..
 }   
}


                                

Spring構成での接続


Webモジュールにパッケージされた howto-ejb-service.xmlには、Spring構成が含まれます。 次のように、Spring Beanは EmplyeeFacade EJBのリモート・ビジネス・インタフェースを使用し、 JndiObjectFactoryBeanを使用してENCから取得されることを確認してください。

<bean id = "employeeFacade" class = "org.springframework.jndi.JndiObjectFactoryBean">
<property name = "jndiName" value = "java:comp/env/ejb/EmployeeFacade"/>
</bean>


We use setter injection in EmployeeFacadeServiceBean to inject an instance of EmployeeFacade EJB and hence must be referenced as follows:

<bean id="employeeFacadeService" class="oracle.ejb30.EmployeeFacadeServiceBean">
<property name = "employeeFacade" ref = "employeeFacade"/>
</bean>

前提条件

必須知識

アプリケーションのサンプルを完了させるには、以下を熟知している必要があります。

EJB 3.0の詳細は、OTNの次のドキュメントを参照してください。

ソフトウェア要件

このデモンストレーションでは、次のソフトウェア・コンポーネントがインストールされ、正しく構成されている必要があります。

表記法

  • %ORACLE_HOME% - Oracle Application Server 10g 10.1.3.1をインストールしたディレクトリ
  • %SPRING_HOME% - Spring Frameworkバージョン2.0をインストールしたディレクトリ
  • %JAVA_HOME% - 使用するJDKがインストールされているディレクトリ
  • %HOWTO_HOME% - デモンストレーションを解凍したディレクトリ

アプリケーションの構築

構成ファイルは %HOWTO_HOME%/etcディレクトリにあり、application.xmlなどのデプロイメント・ディスクリプタ・ファイルが含まれます。

アプリケーションの実行

Oracle Application Server 10g 10.1.3.1のスタンドアロンのインスタンスでアプリケーションのサンプルを実行するには、次の手順に従ってください。

1. サンプルのファイル・ディレクトリの検証

  • build - ビルド時に作成される一時ディレクトリ
  • log - ビルド/デプロイのログを保持する一時ディレクトリ
  • etc - アプリケーションのパッケージ化に必要なすべてのファイル
  • lib - デプロイ可能なアプリケーション・アーカイブを保持
  • doc - How-ToドキュメントとJavadoc
    • how-to-spring-ejb30.html - このWebサイト
  • src - デモンストレーションのソース
    • ejb - サンプルのエンティティ、Spring Bean、およびDAOを含む
    • web - アプリケーションの格納先

2. 環境の設定

次の環境変数が定義されていることを確認してください。

  • %ORACLE_HOME% - Oracle Containers for J2EE(OC4J)がインストールされているディレクトリ
  • %SPRING_HOME% - Spring 2.0がインストールされているディレクトリ
  • %JAVA_HOME% - J2SE 5.0がインストールされているディレクトリ
  • %PATH% - %ORACLE_HOME% /ant/binを含む

データソースの設定

この例には、エンティティを維持するデータベースへ接続するために構成されるデフォルトのDataSource( jndi-locationjdbc/OracleDSを使用)が必要です。 永続性ユニットを構成して、Oracle TopLink Essentialsの自動表作成機能を使用します。 詳しくは、 http://www.oracle.com/technology/products/ias/toplink/jpa/resources/toplink-jpa-extensions.htmlを参照してください。

Oracle Containers for J2EEの場合、 %ORACLE_HOME%/j2ee/home/config/data-sources.xmlファイルのDataSourceを設定して、スキーマを指すように指定します。

設定例は、以下のとおりです。 Application Server Controlを使用して、既存のDataSourceを作成または変更できます。

<connection-pool name="ScottConnectionPool">
  <connection-factory factory-class="oracle.jdbc.pool.OracleDataSource"
   user="scott"
   password="tiger"
   url="jdbc:oracle:thin:@localhost:1521:ORCL" >
  </connection-factory>
</connection-pool>

<managed-data-source name="OracleManagedDS"
 connection-pool-name="ScottConnectionPool"
 jndi-name="jdbc/OracleDS"
/> 

 

ANTタスクを使用して、JDBCリソースを作成できます。 ant-oracle.propertiesファイルのデータベース構成(db.host、db.sid、db.port、db.user、db.password)が変更されていることを確認してください。

$ORACLE_HOME/ant/binPATH環境変数に含まれていることを確認し、次のコマンドを実行してください。

>ant configure-ds

3. サーバーの起動

上記を変更した後に、次のコマンドを使用してOracle Containers for J2EE(OC4J)をスタンドアロンで起動します。

>%ORACLE_HOME%/bin/oc4j -start

Oracle Application Server管理インストールを使用している場合、上記の変更後に次のコマンドを使用します。

> %ORACLE_HOME%/opmn/bin/opmnctl startall

4. アプリケーションの生成、コンパイル、およびデプロイ

Ant 1.6.2はOracle Containers for J2EE(OC4J)に同梱されており、 PATH環境変数を $ORACLE_HOME/ant/binに設定する必要があります。 オペレーティング・システムによっては、現在はAntが環境変数をサポートしていないものがあります。 該当するオペレーティング・システムの場合は、 %HOWTO_HOME%ディレクトリにあるant-oracle.xmlを修正してください。

demo directoryのant-oracle.propertiesを編集し、 次のOracle Containers for J2EE(OC4J)スタンドアロンで示されているとおりに、プロパティに正しい値が設定されていることを確認してください。

  • oc4j.host:Oracle Containers for J2EE(OC4J)が稼働しているホスト (デフォルトはlocalhost)
  • oc4j.admin.port:RMIポート番号(デフォルトは23791)
  • oc4j.admin.user:管理ユーザー名(デフォルトはoc4jadmin)
  • oc4j.admin.password:管理ユーザーのパスワード(デフォルトはwelcome)
  • oc4j.binding.module:デプロイしたWebモジュールがあるWebサイト名(デフォルトはhttp-web-site)

Oracle Application Server管理インストールを使用している場合、Oracle Application Serverインストールで管理されているOracle Containers for J2EE(OC4J)インスタンスの oc4j.admin.userおよび oc4j.admin.password以外の変更については、次のプロパティを変更します。

  • opmn.host:Oracle Application Serverが稼働しているhostname/IP (デフォルトはlocalhost)
  • opmn.port:Oracle Application Serverインストール時のOPMNリクエスト・ポート(デフォルトは6003)
  • oc4j.instance:管理ユーザー名(デフォルトはoc4jadmin)

環境に応じて、ant-oracle.propertiesのdeployer.uriを適切にコメントアウトする必要があります。たとえば、OPMNの管理する単一のOracle Containers for J2EE(OC4J)インスタンスやクラスタ化されたOC4Jインスタンス/グループなどです。

アプリケーションを構築するには、 %HOWTO_HOME%ディレクトリで次のコマンドを入力します。

>ant

これで、 %HOWTO_HOME%/libディレクトリ内に springejb3.earが新しく作成されます。

構築が成功すると、このコマンドはアプリケーション・アーカイブのデプロイを試みます。 このコマンドはデプロイを実行する前に、Oracle Containers for J2EEが稼働しているかをテストします。

アプリケーションは、別々にデプロイすることもできます。 %ORACLE_HOME%の環境変数が定義されていることを確認したら、 %HOWTO_HOME%ディレクトリから次のコマンドを入力します。

>ant deploy

5. アプリケーションの実行

任意のWebブラウザから次のURLを起動して、サンプルを実行します。

http://localhost:8888/springejb3

このページで、Employee No、Name、およびSalaryを入力したら、「 Add Employee」ボタンをクリックします。

InsertServletが従業員を維持するために呼び出されます。 InsertServletは、 addEmployeeメソッドの EmployeeFacadeを呼び出します。 EmployeeFacade Beanは、エンティティ・インスタンスを維持するためにSpringの JpaTemplateを活用するEmployeeServiceBean(Springが管理するBean)を使用します。

レコードの挿入が成功した場合、成功したページへリダイレクトされます。 レコードが作成されたかどうかは、データベース表で確認することもできます。

まとめ

このドキュメントで学習した内容は、次のとおりです。

  • Spring BeanからEJB 3.0 Session Beanへのアクセス
  • Oracle Application Server 10g 10.1.3.1のあるSpringでのEJB 3.0 Session Beanを使用したサンプル・アプリケーションの開発および実行