4.3.3. Migración del ejemplo de reservas Seam 2.2 a JBoss EAP 6

Resumen

La migración EAR de reservas Seam 2.2 es más complicada que el ejemplo de Seam 2.2 JPA WAR. La documentación para la migración del ejemplo Seam 2.2 JPA WAR se puede encontrar aquí: Sección 4.3.2, “Migración del ejemplo Seam 2.2 JPA a JBoss EAP 6”. Para migrar la aplicación tiene que hacer la siguiente:

  1. Inicializar JSF 1.2 en lugar del JSF 2 predeterminado.
  2. Agrupe versiones antiguas de las JARs Hibernate en lugar de utilizar las que se envían junto con JBoss EAP 6.
  3. Cambie los enlaces JNDI para utilizar la nueva sintaxis portátil JNDI Java EE 6.
Los primeros 2 pasos anteriores se realizaron en la migración del ejemplo WAR JPA Seam 2.2. El tercer paso es nuevo y es necesario ya que el EAR contiene EJBs.

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 4.7. Migración del ejemplo de reservas Seam 2.2

  1. Cree el archivo jboss-deployment-structure.xml

    Cree un nuevo archivo llamado jboss-deployment-structure.xml en el jboss-seam-booking.ear/META-INF/ y agregue el siguiente contenido:
    <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. Modifique el archivo jboss-seam-booking.jar/META-INF/persistence.xml así:

    1. Omita o borre el comentario de la propiedad hibernate para la clase del proveedor cache:
      <!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->
    2. Agregue la propiedad del módulo proveedor al archivo jboss-seam-booking.jar/META-INF/persistence.xml:
      <property name="jboss.as.jpa.providerModule" value="hibernate3-bundled" />
    3. Cambie la propiedad jta-data-source para utilizar el nombre JNDI de la fuente de datos JDBC predeterminada:
      <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
  3. Copie las JARs de la distribución Seam 2.2

    Copie las siguientes JARs de la distribución Seam 2.2 EAP5.x_HOME/jboss-eap5.x/seam/lib/ en el directorio 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. Cambie los nombres de búsqueda JNDI

    Cambie las cadenas de búsqueda JNDI en el archivo jboss-seam-booking.war/WEB-INF/components.xml. Debido a las nuevas reglas portátiles JNDI, JBoss EAP 6 ahora enlaza EJBs usando reglas de sintaxis portátiles JNDI y no puede utilizar el jndiPattern que se utilizó en JBoss EAP 5. Así se deben cambiar las cadenas de búsqueda JNDI EJB de la aplicación para 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
    
    Las cadenas de búsqueda JNDI para las EJBs del marco de trabajo Seam 2.2 se debn cambiar así:
    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
    
    Puede tomar cualquiera de los siguientes enfoques:
    1. Agregar elementos del componente

      Puede agregar un jndi-name para todo EJB al 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. Puede modificar el código agregando la anotación @JNDIName(value="") especificando la ruta JNDI. A continuación puede ver un ejemplo del código cambiado del bean de sesión sin estado. Puede encontrar una descripción detallada de este proceso en la documentación de referencia de Seam 2.2.
      @Stateless
      @Name("authenticator")
      @JndiName(value="java:app/jboss-seam-booking/AuthenticatorAction")
      public class AuthenticatorAction 
          implements Authenticator
      {
      ...
      }
      
Resultado:

La aplicación de reservas Seam 2.2 implementa y ejecuta de manera exitosa en JBoss EAP 6.