3.2.13. Migración de aplicaciones Seam 2.2

3.2.13.1. Migración de archivadores Seam 2.2 a JBoss EAP 6

Sinopsis

Cuando migra una aplicación Seam 2.2 necesita configurar la fuente de datos y especificar las dependencias de los módulos. También necesita determinar si la aplicación tiene alguna dependencia en archivadores que no se envían junto con JBoss EAP 6 y copie las JARs dependientes en el directorio lib/ de la aplicación.

Importante

Las aplicaciones que usan Hibernate directamente con Seam 2.2 pueden usar una versión de Hibernate 3 empacada dentro de la aplicación. Hibernate 4, el cual se proporciona a través del módulo org.hibernate de JBoss EAP 6 no es soportado por parte de Seam 2.2. Este ejemplo tiene el propósito de ayudarle a empezar a ejecutar su JBoss EAP 6 como primer paso. Tenga en cuenta que el empacar Hibernate 3 con una aplicación Seam 2.2 no es una configuración soportada.

Procedimiento 3.25. Migración de archivadores Seam 2.2

  1. Actualización de la configuración de la fuente de datos

    Algunos ejemplos de Seam 2.2 usan la fuente de datos JDBC predeterminada llamada java:/ExampleDS. Esta fuente de datos predeterminada cambió en JBoss EAP 6 a java:jboss/datasources/ExampleDS. Si su aplicación usa la base de datos del ejemplo puede hacer una de las siguientes cosas:
    • Si quiere utilizar la base de datos del ejemplo que se envía junto con JBoss EAP 6, modifique el archivo META-INF/persistence.xml para reemplazar el elemento jta-data-source existente con el nombre JNDI de la fuente de datos de la base de datos:
      <!-- <jta-data-source>java:/ExampleDS</jta-data-source> -->
      <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
    • Si prefiere mantener su base de datos existente, puede agregar la definición de la fuente de datos al archivo EAP_HOME/standalone/configuration/standalone.xml.

      Importante

      Tiene que detener el servidor antes de modificar el archivo de configuración del servidor para que su cambio persista al reiniciar el servidor.
      La siguiente definición es una copia de la fuente de datos HSQL predeterminada definida en 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>
    • También puede agregar la definición de la fuente de datos usando la interfaz de la línea de comandos del CLI de administración. El siguiente es un ejemplo de la sintaxis que tiene que utilizar para agregar una fuente de datos. La "\" al final de la línea indica la continuación del comando en la siguiente línea.

      Ejemplo 3.3. Ejemplo de la sintaxis para agregar la definición de la fuente de datos

      $ 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
      
    Para mayor información sobre cómo configurar una fuente de datos consulte Sección 3.1.6.2, “Actualización de la configuración de la fuente de datos”.
  2. Agregar las dependencias requeridas

    Ya que las aplicaciones Seam 2.2 usan JSF 1.2, necesita agregar las dependencias para los módulos JSF 1.2 y excluir los módulos JSF 2.0. Para lograr esto necesita crear un archivo jboss-deployment-structure.xml en el directorio META-INF/ del EAR que contiene los siguientes datos:
    <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 su aplicación usa marcos de trabajo de registro de terceros es necesario agregar esas dependencias tal como se describe aquí: Sección 3.1.4.1, “Modificar las dependencias de registros”.
  3. Si su aplicación usa Hibernate 3.x, primero trate de ejecutar la aplicación usando las bibliotecas Hibernate 4

    Si su aplicación no usa el contexto de persistencia administrada Seam, la búsqueda Hibernate, validación u otras funcionalidades que han cambiado con Hibernate 4, es posible que pueda ejecutar con las bibliotecas Hibernate 4. Sin embargo, si ve ClassNotFoundExceptions o ClassCastExceptions que apuntan a las clases Hibernate o ve errores similares al siguiente puede que necesite seguir las instrucciones en el siguiente paso y modificar la aplicación para utilizar bibliotecas 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. Copie los archivos dependientes de fuera de los marcos de trabajo u otros lugares

    Si su aplicación usa Hibernate 3.x y no puede utilizar Hibernate 4 de manera exitosa con su aplicación, necesitará copiar las JARs Hibernate 3.x en el directorio /lib y excluir el módulo Hibernate en la sección de implementaciones del META-INF/jboss-deployment-structure.xml así:
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
     <deployment>
       <exclusions>
         <module name="org.hibernate"/>
       </exclusions>
     <deployment>
    </jboss-deployment-structure>
    Tiene que tomar pasos adicionales cuando agrupa Hibernate 3.x con su aplicación. Para mayor información, consulte Sección 3.2.2.2, “Configuración de cambios para las aplicaciones que usan Hibernate y JPA”.
  5. Depurar y resolver errores JNDI Seam 2.2

    Cuando migra una aplicación Seam 2.2 puede que vea errores javax.naming.NameNotFoundException en el registro como el siguiente:
    javax.naming.NameNotFoundException: Name 'jboss-seam-booking' not found in context ''
    Si no quiere modificar las búsquedas JNDI en el código, puede modificar el archivo components.xml de la aplicación de esta manera:
    1. Reemplazar el elemento core-init existente

      Primero necesita reemplazar el elemento core-init existente así:
      <!-- <core:init jndi-pattern="jboss-seam-booking/#{ejbName}/local" debug="true" distributable="false"/>   -->
      <core:init debug="true" distributable="false"/>
      
    2. Busque los mensajes INFO de enlace JNDI en el registro del servidor

      Luego, busque los mensajes INFO de enlace JNDI que se imprimen en el registro del servidor cuando se implementa la aplicación. Los mensajes de enlace JNDI se deben ver de manera similar a este:
      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. Agregar elementos del componente

      Para cada mensaje INFO de enlace JNDI en el registro, agregue un elemento component que coincida en el archivo components.xml:
      <component class="org.jboss.seam.example.booking.AuthenticatorAction" jndi-name="java:app/jboss-seam-booking.jar/AuthenticatorAction" />
    Para mayor información sobre cómo depurar y resolver problemas de migración consulte Sección 4.2.1, “Depurar y resolver problemas de migración”.
    Para ver una lista de problemas de migración conocidos con los archivadores Seam 2 consulte Sección 3.2.13.2, “Problemas de migración del archivador Seam 2.2 ”.
Resultado

El archivador Seam 2.2 implementa y ejecuta de manera exitosa en JBoss EAP 6.