4.3.3. Migração da Amostra do Seam 2.2 JPA para o JBoss EAP 6

Sumário

A migração do Seam 2.2 Booking EAR é mais complicada do que a amostra Seam 2.2 JPA WAR. A documentação para a migração da amostra Seam 2.2 JPA WAR pode ser encontrada na Seção 4.3.2, “Migração da Amostra Seam 2.2 JPA para o JBoss EAP 6”. Para migrar o aplicativo, por favor realize o seguinte:

  1. Inicialize o JSF 1.2 ao invés do JSF 2 default.
  2. Empacote versões antigas dos Hibernate JARs ao invés de usar aquelas que lançam o JBoss EAP 6.
  3. Altere os bindings JNDI para uso da nova sintaxe portátil do Java EE 6 JNDI.
As primeiras duas etapas foram feitas na migração da amostra Seam 2.2 JPA WAR. A terceira etapa é nova e é necessária uma vez que o EAR contém EJBs.

Importante

Os aplicativos que usam o Hibernate diretamente com o Seam 2.2 podem usar a versão do Hibernate 3 empacotados dentro do aplicativo. O Hibernate 4, que é fornecido através do módulo org.hibernate do JBoss EAP 6, não é suportado pelo Seam 2.2. Esta amostra possui por intenção ajudá-lo executar o seu aplicativo no JBoss EAP 6 como primeira etapa. Lembre-se de que o empacotamento do Hibernate 3 com o aplicativo Seam 2.2 não é uma configuração suportada.

Procedimento 4.7. Migração da amostra Seam 2.2 Booking

  1. Crie o arquivo jboss-deployment-structure.xml

    Crie um novo arquivo nomeado jboss-deployment-structure.xml no jboss-seam-booking.ear/META-INF/ e adicione o seguinte conteúdo:
    <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 o arquivo jboss-seam-booking.jar/META-INF/persistence.xml conforme o seguinte.

    1. Remova ou comente a propriedade do hibernate para a classe do provedor do cache:
      <!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->
      
    2. Adicione a propriedade do módulo do provedor ao arquivo jboss-seam-booking.jar/META-INF/persistence.xml:
      <property name="jboss.as.jpa.providerModule" value="hibernate3-bundled" />
      
    3. Altere a propriedade jta-data-source para uso do nome JNDI da fonte de dados JDBC:
      <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
      
  3. Copie os JARs a partir da distribuição Seam 2.2

    Copie os seguintes JARs a partir da distribuição Seam 2.2 EAP5.x_HOME/jboss-eap5.x/seam/lib/ no diretório 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. Altere os nomes de pesquisa JNDI

    Altere os strings de pesquisa JNDI no arquivo jboss-seam-booking.war/WEB-INF/components.xml. O JBoss EAP 6 efetua o bind nos EJBs usando as regras de sintaxe portátil JNDI e não é possível usar o jndiPattern que era usado no JBoss EAP 5. Segue abaixo os strings de pesquisa EJB JNDI do aplicativo que devem ser alterados no 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
    
    Os strings de pesquisa para os EJBs de framework Seam 2.2 devem ser alteradas conforme abaixo:
    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
    
    É possível usar uma das seguintes abordagens:
    1. Adição dos elementos do componente

      É possível adicionar um jndi-name para cada EJB ao 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. É possível modificar o código pela adição da anotação @JNDIName(value="") especificando o caminho JNDI. Segue abaixo uma amostra alterada do código bean de sessão stateless. Uma descrição detalhada deste processo pode ser encontrada na documentação de referência Seam 2.2.
      @Stateless
      @Name("authenticator")
      @JndiName(value="java:app/jboss-seam-booking/AuthenticatorAction")
      public class AuthenticatorAction 
          implements Authenticator
      {
      ...
      }
      
Resultado:

O aplicativo da amostra Seam 2.2 Booking implanta e executa com êxito no JBoss EAP 6.