3.2.13. Migrer les applications Seam 2.2

3.2.13.1. Migrer les Archives Seam 2.2 dans JBoss EAP 6

Aperçu

Lorsque vous migrez une application Seam 2.2, vous devez configurer la source de données et spécifier toutes les dépendances de module. Vous devez également déterminer si l'application a des dépendances sur les archives qui ne sont pas fournies avec JBoss EAP 6 et copier tout JAR dépendant dans le répertoire de l'application lib/.

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 3.25. Migrer les Archives Seam 2.2

  1. Mettre à jour la configuration de la source de données

    Certains exemples Seam 2.2 utilisent la source de données JDBC par défaut nommée java:/ExampleDS. Cette source de données par défaut a changé dans JBoss EAP 6 en java:jboss/datasources/ExampleDS. Si votre application utilise la base de donnée de l'exemple, vous pourrez faire ce qui suit :
    • Si vous voulez utiliser la base de données de l'exemple fourni dans JBoss EAP 6, modifier le fichier META-INF/persistence.xml pour remplacer l'élément jta-data-source existant par le nom JNDI de la source de données :
      <!-- <jta-data-source>java:/ExampleDS</jta-data-source> -->
      <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
    • Si vous préférez conserver votre base de données existante, vous pouvez ajouter la définition de votre base de données dans le fichier EAP_HOME/standalone/configuration/standalone.xml.

      Important

      Vous devez interrompre le serveur avant de modifier le fichier de configuration du serveur pour que votre changement puisse être persisté au redémarrage du serveur.
      Voici une définition qui est une copie de la source de données HSQL par défaut définie dans JBoss EAP 6.
      <datasource name="ExampleDS" jndi-name="java:/ExampleDS" enabled="true" jta="true" use-java-context="true" use-ccm="true">
         <connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1</connection-url>
         <driver>h2</driver>
         <security>
            <user-name>sa</user-name>
            <password>sa</password>
         </security>
      </datasource>
    • Vous pouvez également ajouter la définition de source de données à l'aide de l'interface de ligne de commande. Voici un exemple de la syntaxe, que vous devez utiliser pour ajouter une source de données. Le « \ » à la fin de la ligne indique la continuation de la commande sur la ligne suivante.

      Exemple 3.3. Exemple de syntaxe à ajouter à la définition de la source de données

      $ EAP_HOME/bin/jboss-cli --connect 
      [standalone@localhost:9999 /] data-source add --name=ExampleDS --jndi-name=java:/ExampleDS \ 
            --connection-url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1 --driver-name=h2 \ 
            --user-name=sa --password=sa
      
    Pour obtenir plus d'informations sur la façon de configurer une source de données, voir Section 3.1.6.2, « Mise à jour de la Configuration de la Source de données ».
  2. Ajouter une dépendance requise

    Comme les applications Seam 2.2 utilisent JSF 1.2, vous devez ajouter des dépendances aux modules de JSF 1.2 et exclure les modules de JSF 2.0. Pour ce faire, vous devez créer un fichier jboss-deployment-structure.xml dans le répertoire EAR META-INF/ qui contient les données suivantes :
    <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"/>
          </dependencies>
      </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>
    Si votre application utilise n'importe quel framework de logging de tiece partie, vous devez ajouter ces dépendances comme décrit ici : Section 3.1.4.1, « Modifier les Dépendances de Logging ».
  3. Si votre application utilise Hibernate 3.x, essayez tout d'abord d'exécuter l'application en utilisant les bibliothèques Hibernate 4

    Si votre application n'utilise pas le contexte de persistance gérée par Seam, la recherche Hibernate, la validation ou autres éléments qui ont été modifiés dans Hibernate 4, vous pourrez exécuter avec les bibliothèques d'Hibernate 4. Toutefois, si vous voyez ClassNotFoundExceptions ou ClassCastExceptions pointant vers des classes Hibernate, ou voir des erreurs similaires à ce qui suit, vous devrez suivre les instructions à l'étape suivante et modifier l'application pour utiliser les bibliothèques d'Hibernate 3.3.
            Caused by: java.lang.LinkageError: loader constraint violation in interface itable initialization: when resolving method "org.jboss.seam.persistence.HibernateSessionProxy.getSession(Lorg/hibernate/EntityMode;)Lorg/hibernate/Session;" the class loader (instance of org/jboss/modules/ModuleClassLoader) of the current class, org/jboss/seam/persistence/HibernateSessionProxy, and the class loader (instance of org/jboss/modules/ModuleClassLoader) for interface org/hibernate/Session have different Class objects for the type org/hibernate/Session used in the signature
    
  4. Copier les archives dépendantes en provenance de frameworks extérieurs ou d'autres locations.

    Si votre application utilise Hibernate 3.x et que vous n'êtes pas en mesure d'utiliser Hibernate 4 avec succès avec votre application, vous devrez copier les JARs Hibernate 3.x dans le répertoire / lib et exclure le module Hibernate de la section de déploiements de META-INF/jboss-déploiement-structure.xml comme suit :
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
     <deployment>
       <exclusions>
         <module name="org.hibernate"/>
       </exclusions>
     <deployment>
    </jboss-deployment-structure>
    Il y a des étapes supplémentaires que vous devez prendre pour grouper Hibernate 3.x avec votre application. Pour plus d'informations, consultez Section 3.2.2.2, « Configuration des changements des applications qui utilisent Hibernate et JPA ».
  5. Débogger et résoudre les erreurs de Seam 2.2 JNDI

    Quand vous migrez une application Seam 2.2, vous apercevez sans doute les erreurs javax.naming.NameNotFoundException dans le log, sous la forme :
    javax.naming.NameNotFoundException: Name 'jboss-seam-booking' not found in context ''
    Si vous ne voulez pas modifier les recherches JNDI dans tout le code, vous pouvez modifier les fichiers components.xml de l'application comme suit :
    1. Remplacer l'élément core-init existant

      Tout d'abord, vous devrez remplacer l'élément core-init existant comme suit :
      <!-- <core:init jndi-pattern="jboss-seam-booking/#{ejbName}/local" debug="true" distributable="false"/>   -->
      <core:init debug="true" distributable="false"/>
      
    2. Cherchez les messages JNDI binding INFO dans la log du serveur

      Puis, vous devrez chercher les messages JNDI binding INFO dans la log du serveur quand l'application est déployée. Les messages de liaison JNDI ressemblent à ce qui suit :
      INFO org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor (MSC service thread 1-1) JNDI bindings for session bean
      named AuthenticatorAction in deployment unit subdeployment "jboss-seam-booking.jar" of deployment "jboss-seam-booking.ear" are as follows:
          java:global/jboss-seam-booking/jboss-seam-booking.jar/AuthenticatorAction!org.jboss.seam.example.booking.Authenticator
          java:app/jboss-seam-booking.jar/AuthenticatorAction!org.jboss.seam.example.booking.Authenticator
          java:module/AuthenticatorAction!org.jboss.seam.example.booking.Authenticator
          java:global/jboss-seam-booking/jboss-seam-booking.jar/AuthenticatorAction
          java:app/jboss-seam-booking.jar/AuthenticatorAction
          java:module/AuthenticatorAction
      
    3. Ajouter des éléments de composants

      Pour chaque message JNDI binding INFO du log, ajouter un élément component correspondant au fichier components.xml :
      <component class="org.jboss.seam.example.booking.AuthenticatorAction" jndi-name="java:app/jboss-seam-booking.jar/AuthenticatorAction" />
    Pour en savoir davantage sur la façon de déboguer et résoudre les problèmes de migration, voir Section 4.2.1, « Déboguer et Résoudre les problèmes de migration ».
    Pour obtenir une liste des problèmes de migration avec Seam 2, voir Section 3.2.13.2, « Problèmes de Migrations d'archives dans Seam 2.2 ».
Résultat

L'archive Seam 2.2 déploie et exécute successivement sur JBoss EAP 6.