4.3.3. Seam 2.2. Booking 例の JBoss Enterprise Application Platform 6 への移行

概要

Seam 2.2 Booking EAR の移行は Seam 2.2 JPA WAR サンプルの移行よりも複雑です。Seam 2.2 JPA WAR サンプルの移行に関するドキュメントについては、「Seam 2.2. JPA 例の JBoss Enterprise Application Platform 6 への移行」を参照してください。アプリケーションを移行するには、以下を実行する必要があります。

  1. デフォルトの JSF 2 の代わりに JSF 1.2 を初期化します。
  2. JBoss Enterprise Application Platform 6 に同梱された Hibernate JAR を使用するのではなく、古いバージョンの Hibernate JAR をバンドルします。
  3. 新しい Java EE 6 JNDI の移植可能な構文を使用するよう JNDI バインディングを変更します。
上記の最初の 2 つの手順は、Seam 2.2 JPA WAR サンプルの移行で行われました。3 番目の手順は新しい手順であり、EAR には EJB が含まれるため、必要です。

重要

Seam 2.2 で Hibernate を直接使用するアプリケーションは、アプリケーション内部にパッケージ化された Hibernate 3 のバージョンを使用できます。JBoss Enterprise Application Platform 6 の org.hibernate モジュールを介して提供される Hibernate 4 は、Seam 2.2 によりサポートされません。この例では、最初の手順として JBoss Enterprise Application Platform 6 でアプリケーションを実行します。Hibernate 3 を Seam 2.2 アプリケーションでパッケージ化することはサポートされた設定ではないことに注意してください。

手順4.13 Seam 2.2 Booking 例の移行

  1. jboss-deployment-structure.xml ファイルの作成

    jboss-deployment-structure.xml という名前の新しいファイルを jboss-seam-booking.ear/META-INF/ で作成し、以下の内容を追加します。
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
      <deployment>
            <dependencies>
              <module name="org.apache.log4j" export="true"/>
              <module name="org.dom4j" export="true"/>
              <module name="org.apache.commons.logging" export="true"/>
              <module name="org.apache.commons.collections" export="true"/>
              <module name="javax.faces.api" slot="1.2" export="true"/>
              <module name="com.sun.jsf-impl" slot="1.2" export="true"/>
            </dependencies>
      </deployment>
      <sub-deployment name="booking-web.war"> 
          <exclusions>
              <module name="javax.faces.api" slot="main"/>
              <module name="com.sun.jsf-impl" slot="main"/>
            </exclusions>
            <dependencies>
              <module name="javax.faces.api" slot="1.2"/>
              <module name="com.sun.jsf-impl" slot="1.2"/>
            </dependencies>
      </sub-deployment> 
     </jboss-deployment-structure>
    
  2. キャッシュプロバイダークラスの hibernate プロパティーの削除

    jboss-seam-booking.jar/META-INF/persistence.xml ファイルのキャッシュプロバイダークラスに対する hibernate プロパティーを削除またはコメントアウトします。
    <!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->
    
  3. Seam 2.2 ディストリビューションより JAR をコピー

    以下の JAR を Seam 2.2 ディストリビューションの EAP5.x_HOME/jboss-eap5.x/seam/lib/ から jboss-seam-booking.ear/lib ディレクトリーにコピーします。
    slf4j-api.jar 
    slf4j-log4j12.jar 
    hibernate-core.jar 
    hibernate-entitymanager.jar 
    hibernate-validator.jar 
    hibernate-annotations.jar 
    hibernate-commons-annotations.jar
    
  4. JNDI ルックアップ名の変更

    jboss-seam-booking.war/WEB-INF/components.xml ファイルの JNDI ルックアップ文字列を変更します。新しい移植可能な JNDI のルールが導入されたため、JBoss Enterprise Application Platform 6 は 移植可能な JNDI の構文ルールを使用して EJB をバインドします。JBoss Enterprise Application Platform 5 で使用された単一の jndiPattern を使用することはできません。JBoss Enterprise Application Platform 6 ではアプリケーションの EJB JNDI ルックアップ文字列を次のように変更する必要があります。
    java:global/seam-booking/booking-ejb/HotelSearchingAction!org.jboss.seam.example.booking.HotelSearching
    java:app/booking-ejb/HotelSearchingAction!org.jboss.seam.example.booking.HotelSearching
    java:module/HotelSearchingAction!org.jboss.seam.example.booking.HotelSearching
    java:global/seam-booking/booking-ejb/HotelSearchingAction
    java:app/booking-ejb/HotelSearchingAction
    java:module/HotelSearchingAction
    
    Seam 2.2 フレームワーク EJB に対する JNDI ルックアップ文字列は、以下のように変更する必要があります。
    java:global/seam-booking/jboss-seam/EjbSynchronizations!org.jboss.seam.transaction.LocalEjbSynchronizations
    java:app/jboss-seam/EjbSynchronizations!org.jboss.seam.transaction.LocalEjbSynchronizations
    java:module/EjbSynchronizations!org.jboss.seam.transaction.LocalEjbSynchronizations
    java:global/seam-booking/jboss-seam/EjbSynchronizations
    java:app/jboss-seam/EjbSynchronizations
    java:module/EjbSynchronizations
    
    以下のどちらかの方法を使用できます。
    1. コンポーネント要素の追加

      各 EJB に対する jndi-nameWEB-INF/components.xml に追加できます。
      <component class="org.jboss.seam.transaction.EjbSynchronizations" jndi-name="java:app/jboss-seam/EjbSynchronizations"/>
      <component class="org.jboss.seam.async.TimerServiceDispatcher" jndi-name="java:app/jboss-seam/TimerServiceDispatcher"/>
      <component class="org.jboss.seam.example.booking.AuthenticatorAction" jndi-name="java:app/booking-ejb/AuthenticatorAction" />
      <component class="org.jboss.seam.example.booking.BookingListAction"  jndi-name="java:app/booking-ejb/BookingListAction" />
      <component class="org.jboss.seam.example.booking.RegisterAction" jndi-name="java:app/booking-ejb/RegisterAction" />
      <component class="org.jboss.seam.example.booking.HotelSearchingAction" jndi-name="java:app/booking-ejb/HotelSearchingAction" />
      <component class="org.jboss.seam.example.booking.HotelBookingAction" jndi-name="java:app/booking-ejb/HotelBookingAction" />
      <component class="org.jboss.seam.example.booking.ChangePasswordAction" jndi-name="java:app/booking-ejb/ChangePasswordAction" />
      
      
    2. JNDI パスを指定する @JNDIName(value="") アノテーションを追加してコードを変更することができます。変更されたステートレスセッション Bean のコード例は次のとおりです。この処理の詳細については、Seam 2.2 のリファレンスドキュメントを参照してください。
      @Stateless
      @Name("authenticator")
      @JndiName(value="java:app/booking-ejb/AuthenticatorAction")
      public class AuthenticatorAction 
          implements Authenticator
      {
      ...
      }
      
結果

Seam 2.2 の Booking アプリケーションが JBoss Enterprise Application Platform 6 上にデプロイされ、正常に実行されます。