4.3.3. Migrer l'exemple de Seam 2.2 Booking dans JBoss EAP 6

Résumé

La migration du Seam 2.2 Booking EAR est plus compliquée que celle de l'exemple Seam 2.2 JPA WAR. On peut trouver la documentation pour l'exemple Seam 2.2 JPA WAR à cet endroit : Section 4.3.2, « Migrer l'exemple Seam 2.2 dans JBoss EAP 6 ». Pour migrer l'application, vous devez procéder ainsi :

  1. Initialiser JSF 1.2 à la place de JSF 2 (défaut).
  2. Regrouper les anciennes versions des JAR Hibernate plutôt que les JARS fournis dans Boss EAP 6.
  3. Changer les liaisons JNDI pour qu'elles utilisent la nouvelle syntaxe de Java EE 6 JNDI portable.
Les deux premières étapes ci-dessus avaient lieu dans l'exemple de migration de Seam 2.2 JPA WAR. La troisième étape est nouvelle et elle est nécessaire car l'EAR contient des EJB.

Important

Les applications qui utilisent Hibernate directement avec Seam 2.2 utilisent sans doute une version d'Hibernate 3 empaquetée dans l'application. Hibernate 4, fourni par le module org.hibernate de JBoss EAP 6, n'est pas pris en charge par Seam 2.2. Cet exemple a pour but de vous aider à exécuter votre application dans JBoss EAP 6 comme première étape. Notez qu'empaqueter Hibernate 3 avec une application Seam 2.2 n'est pas une configuration prise en charge.

Procédure 4.7. Migration de l'exemple Seam 2.2 Booking

  1. Créer le fichier jboss-deployment-structure.xml

    Créer un nouveau fichier nommé jboss-deployment-structure.xml dans jboss-seam-booking.ear/META-INF/ et ajouter le contenu suivant :
    <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. Modifier le fichier jboss-seam-booking.jar/META-INF/persistence.xml comme suit.

    1. Supprimer ou dé-commenter la propriété hibernate de la classe de fournisseur de cache :
      <!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->
    2. Ajouter la propriété de module du fournisseur dans le fichier jboss-seam-booking.jar/META-INF/persistence.xml:
      <property name="jboss.as.jpa.providerModule" value="hibernate3-bundled" />
    3. Modifier la propriété jta-data-source pour utiliser le nom JNDI de la source de données JDBC par défaut :
      <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
  3. Copier les JAR de la distribution Seam 2.2

    Copier les JAR suivants de la distribution Seam 2.2 EAP5.x_HOME/jboss-eap5.x/seam/lib/ dans le répertoire jboss-seam-booking.ear/lib.
    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. Modification des noms de Recherche JNDI

    Changer les chaînes de recherche JNDI dans le fichier jboss-seam-booking.war/WEB-INF/components.xml. En raison de nouvelles règles portables JNDI, JBoss EAP 6 se relie maintenant aux EJB à l'aide de règles de syntaxe portables JNDI et vous ne pouvez pas utiliser jndiPattern utilisé dans JBoss EAP 5. Voici les changements requis pour JBoss EAP 6 :
    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
    
    Les chaînes de recherche JNDI des EJB du framework Seam 2.2 doivent être modifiées ainsi :
    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
    
    Vous pouvez adopter une des approches suivantes :
    1. Ajouter des éléments de composants

      Vous pouvez ajouter un jndi-name pour chaque EJB du WEB-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/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. Vous pouvez modifier le code en ajoutant l'annotation @JNDIName(value="") qui indique le chemin JNDI. Vous trouverez un exemple de modification de code de bean de session stateless ci-dessous. Vous trouverez également une description détaillée de ce processus dans la documentation de référence Seam 2.2.
      @Stateless
      @Name("authenticator")
      @JndiName(value="java:app/jboss-seam-booking/AuthenticatorAction")
      public class AuthenticatorAction 
          implements Authenticator
      {
      ...
      }
      
Résultat  :

L'exemple Seam 2.2 Booking déploie et exécute avec succès sur JBoss EAP 6.