4.3.3. Migration des Seam 2.2 Buchungsbeispiels zur JBoss EAP 6

Zusammenfassung

Die Seam 2.2 Booking EAR Migration ist komplizierter als das Seam 2.2 JPA WAR Beispiel. Die Dokumentation für die Seam 2.2 JPA WAR Beispielmigration finden Sie hier: Abschnitt 4.3.2, »Migration des Seam 2.2 JPA Beispiels zur JBoss EAP 6«. Um die Applikation zu migrieren, müssen Sie das Folgende tun:

  1. Initialisieren Sie JSF 1.2 statt des standardmäßigen JSF 2.
  2. Bündeln Sie ältere Versionen der Hibernate JARs statt derer, die mit der JBoss EAP 6 geliefert werden.
  3. Ändern Sie die JNDI-Bindings, damit diese die neue, portierbare Java EE 6 JNDI Syntax verwenden.
Die ersten beiden Schritte wurden bei der Seam 2.2 JPA WAR-Beispielmigration durchgeführt. Der dritte Schritt ist neu und notwendig, weil das EAR EJBs enthält.

Wichtig

Applikationen, die Hibernate direkt mit Seam 2.2 verwenden, können eine innerhalb der Applikation gepackte Version von Hibernate 3 verwenden. Hibernate 4, welches mittels des org.hibernate Moduls der JBoss EAP 6 bereitgestellt wird, wird von Seam 2.2 nicht unterstützt. Dieses Beispiel soll Ihnen dabei helfen, Ihre Applikation auf der JBoss EAP 6 in Betrieb zu nehmen. Bitte beachten Sie, dass das Packen von Hibernate 3 mit einer Seam 2.2 Applikation keine unterstützte Konfiguration ist.

Prozedur 4.7. Migration des Seam 2.2 Buchungsbeispiels

  1. Erstellen Sie die jboss-deployment-structure.xml-Datei

    Erstellen Sie eine neue Datei namens jboss-deployment-structure.xml im jboss-seam-booking.ear/META-INF/ und fügen Sie folgenden Inhalt hinzu:
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
      <deployment>
            <dependencies>
              <module name="javax.faces.api" slot="1.2" export="true"/>
              <module name="com.sun.jsf-impl" slot="1.2" export="true"/>
              <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"/>
            </dependencies>
            <exclusions>
              <module name="org.hibernate" slot="main"/>
           </exclusions>
            
      </deployment>
      <sub-deployment name="jboss-seam-booking.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. Ändern Sie die jboss-seam-booking.jar/META-INF/persistence.xml-Datei wie folgt.

    1. Entfernen Sie die Hibernate-Property für die Cache Provider-Klasse oder kommentieren Sie sie aus:
      <!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->
    2. Provider-Moduleigenschaft zur jboss-seam-booking.jar/META-INF/persistence.xml Datei hinzufügen:
      <property name="jboss.as.jpa.providerModule" value="hibernate3-bundled" />
    3. Die jta-data-source Eigenschaft ändern um den standardmäßigen JDBC Datenquellen JNDI Namen zu benutzen:
      <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
  3. Kopieren Sie JARs aus der Seam 2.2 Distribution

    Kopieren Sie die folgenden JARs aus der Seam 2.2 Distribution EAP5.x_HOME/jboss-eap5.x/seam/lib/ in das jboss-seam-booking.ear/lib-Verzeichnis.
    antlr.jar
    slf4j-api.jar 
    slf4j-log4j12.jar 
    hibernate-core.jar 
    hibernate-entitymanager.jar 
    hibernate-validator.jar 
    hibernate-annotations.jar 
    hibernate-commons-annotations.jar
    
  4. Ändern Sie die JNDI Lookup-Namen

    Ändern Sie die JNDI Lookup-Strings in der jboss-seam-booking.war/WEB-INF/components.xml-Datei. Wegen der neuen JNDI portierbaren Regeln bindet die JBoss EAP 6 jetzt EJBs mittels JNDI portierbarer Syntax-Regeln und Sie nicht das einzelne jndiPattern verwenden wie noch in der JBoss EAP 5. Dies ist, wie Sie die Applikations EJB JNDI Lookup-Strings in der JBoss EAP 6 ändern müssen:
    java:global/jboss-seam-booking/jboss-seam-booking/HotelSearchingAction!org.jboss.seam.example.booking.HotelSearching
    java:app/jboss-seam-booking/HotelSearchingAction!org.jboss.seam.example.booking.HotelSearching
    java:module/HotelSearchingAction!org.jboss.seam.example.booking.HotelSearching
    java:global/jboss-seam-booking/jboss-seam-booking/HotelSearchingAction
    java:app/jboss-seam-booking/HotelSearchingAction
    java:module/HotelSearchingAction
    
    Die JNDI-Lookup-Strings für die Seam 2.2 Framework EJBs müssen wie folgt geändert werden:
    java:global/jboss-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/jboss-seam-booking/jboss-seam/EjbSynchronizations
    java:app/jboss-seam/EjbSynchronizations
    java:module/EjbSynchronizations
    
    Wählen Sie eine der folgenden Vorgehensweisen:
    1. Fügen Sie Komponentenelemente hinzu

      Sie können einen jndi-name für jedes EJB der WEB-INF/components.xml hinzufügen:
          <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/jboss-seam-booking/AuthenticatorAction" />
          <component class="org.jboss.seam.example.booking.BookingListAction"  jndi-name="java:app/jboss-seam-booking/BookingListAction" />
          <component class="org.jboss.seam.example.booking.RegisterAction" jndi-name="java:app/jboss-seam-booking/RegisterAction" />
          <component class="org.jboss.seam.example.booking.HotelSearchingAction" jndi-name="java:app/jboss-seam-booking/HotelSearchingAction" />
          <component class="org.jboss.seam.example.booking.HotelBookingAction" jndi-name="java:app/jboss-seam-booking/HotelBookingAction" />
          <component class="org.jboss.seam.example.booking.ChangePasswordAction" jndi-name="java:app/jboss-seam-booking/ChangePasswordAction" />
      
    2. Sie können den Code bearbeiten, indem Sie die @JNDIName(value="")-Annotation hinzufügen, die den JNDI-Pfad festlegt. Ein Beispiel für den veränderten stateless Session Bean Code sehen Sie unten. Eine ausführliche Beschreibung dieses Vorgangs finden Sie in der Seam 2.2 Referenzdokumentation.
      @Stateless
      @Name("authenticator")
      @JndiName(value="java:app/jboss-seam-booking/AuthenticatorAction")
      public class AuthenticatorAction 
          implements Authenticator
      {
      ...
      }
      
Ergebnis:

Die Seam 2.2 JPA Buchungsanwendung deployt und läuft nun auf der JBoss EAP 6.