4.3.3. Migrer l'Exemple Booking Seam 2.2 dans JBoss Enterprise Application Platform 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 JPA dans JBoss Enterprise Application Platform 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 Enterprise Application Platform 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 Enterprise Application Platform 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 Enterprise Application Platform 6 comme première étape. Notez qu'empaqueter Hibernate 3 avec une application Seam 2.2 n'est pas une configuration empaquetée.

Procédure 4.13. 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="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. Supprimer la propriété hibernate de classe de fournisseur de cache

    Supprimer ou dé-commenter la propriété hibernate de la classe de fournisseur de cache dans le fichier jboss-seam-booking.jar/META-INF/persistence.xml :
    <!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->
    
  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.
    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 Enterprise Application Platform 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 Enterprise Application Platform 5. Voici les changements requis pour JBoss Enterprise Application Platform 6 :
    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
    
    Les chaînes de recherche JNDI des EJB du framework Seam 2.2 doivent être modifiées ainsi :
    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
    
    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/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. 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/booking-ejb/AuthenticatorAction")
      public class AuthenticatorAction 
          implements Authenticator
      {
      ...
      }
      
Résultat :

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