3.2.13. Migração dos Aplicativos Seam 2.2

3.2.13.1. Migração dos Arquivos Seam 2.2 para o JBoss EAP 6

Visão Geral

Quando você migra um aplicativo Seam 2.2, você precisa configurar a fonte de dados e especificar quaisquer dependências de módulo. Você precisa determinar também se o aplicativo possui alguma dependência nos arquivos que não são enviados juntos com o JBoss EAP 6 e copiar os JARs dependentes no diretório lib/ do aplicativo.

Importante

Os aplicativos que usam o Hibernate diretamente com o Seam 2.2 podem usar uma versão do Hibernate 3 empacotada 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. Este exemplo tem a intenção de ajudá-lo a executar o seu aplicativo no JBoss EAP 6 como uma primeira etapa. Você deve estar ciente de que o empacotamento do Hibernate 3 com o aplicativo Seam 2.2 não possui uma configuração com suporte.

Procedimento 3.25. Migração dos Arquivos Seam 2.2

  1. Atualize a configuração da fonte de dados

    Alguns exemplos do Seam 2.2 usam a fonte de dados JDBC padrão nomeada java:/ExampleDS. Essa fonte de dados padrão foi alterada no JBoss EAP 6 para java:jboss/datasources/ExampleDS. Caso seu aplicativo utilize o banco de dados do exemplo, você pode realizar uma das seguintes opções:
    • Se você quiser usar o banco de dados do exemplo que é enviado junto com o JBoss EAP 6, modifique o arquivo META-INF/persistence.xml para substituir o elemento jta-data-source existente com o nome JNDI da fonte de dados do banco de dados do exemplo:
      <!-- <jta-data-source>java:/ExampleDS</jta-data-source> -->
      <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
    • Caso você prefira manter o seu banco de dados existente, você pode adicionar a definição da fonte de dados ao arquivo EAP_HOME/standalone/configuration/standalone.xml.

      Importante

      Você deve interromper o servidor antes de editar o arquivo de configuração do servidor para que a sua alteração seja efetivada ao reiniciar o servidor.
      A seguinte definição é uma cópia da fonte de dados HSQL padrão definida no 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>
    • Você pode também adicionar a definição da fonte de dados usando a interface da linha de comando do Gerenciamento CLI. Segue abaixo um exemplo da sintaxe que você deve usar para adicionar uma fonte de dados. O "\" no final da linha indica a continuação do comando na linha seguinte.

      Exemplo 3.5. Exemplo da sintaxe para a adição da definição da fonte de dados

      $ 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
      
    Consulte Seção 3.1.6.2, “Atualização da Configuração da DataSource” para mais informações sobre como configurar uma fonte de dados.
  2. Adicione quaisquer dependências necessárias

    Já que os aplicativos Seam 2.2 utilizam JSF 1.2, você precisa adicionar dependências para os módulos JSF 1.2 e excluir os módulos JSF 2.0. Para realizar isto, você precisa criar um arquivo jboss-deployment-structure.xml no diretório META-INF/ do EAR que contém os seguintes dados:
    <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>
    Se o seu aplicativo utiliza estruturas de registro em log de terceiros, você precisa adicionar essas dependências conforme descrito aqui: Seção 3.1.4.1, “Modificação das Dependências de Registro em Log”.
  3. Se o seu aplicativo utilza Hibernate 3.x, tente executar primeiro o aplicativo usando as bibliotecas do Hibernate 4

    Se o seu aplicativo não utiliza o Contexto de Persistência Gerenciado Seam, a busca Hibernate, a validação ou quaisquer outros recursos que mudaram com o Hibernate 4, é possível que consiga executar com as bibliotecas do Hibernate 4. No entanto, se você encontrar ClassNotFoundExceptions ou ClassCastExceptions que apontam para as classes Hibernate, ou ver erros semelhantes aos seguintes, é possível que tenha que seguir as instruções da próxima etapa e modificar o seu aplicativo para usar as bibliotecas do 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 os arquivos dependentes das estruturas externas ou de outras localizações

    Se o seu aplicativo utiliza Hibernate 3.x e você não consegue usar Hibernate 4 no seu aplicativo com sucesso, você precisará copiar os JARs do Hibernate 3-x no diretório /lib e excluir o módulo Hibernate na seção de implantações de META-INF/jboss-deployment-structure.xml, como a seguir:
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
     <deployment>
       <exclusions>
         <module name="org.hibernate"/>
       </exclusions>
     <deployment>
    </jboss-deployment-structure>
    Você deve tomar algumas medidas adicionais quando agrupar Hibernate 3.x ao seu aplicativo. Consulte Seção 3.2.2.2, “Configuração das Alterações para os Aplicativos que Utilizam Hibernate e JPA” para mais informações.
  5. Depure e resolva os erros JNDI do Seam 2.2

    Ao migrar o aplicativo Seam 2.2, você pode encontrar erros javax.naming.NameNotFoundException no log, como a seguir:
    javax.naming.NameNotFoundException: Name 'jboss-seam-booking' not found in context ''
    Se você não deseja modificar as pesquisas JNDI através do código, você pode modificar o arquivo components.xml do aplicativo, como a seguir:
    1. Substitua o elemento core-init existente

      Primeiro, você precisa substituir o elemento core-init existente, como a seguir:
      <!-- <core:init jndi-pattern="jboss-seam-booking/#{ejbName}/local" debug="true" distributable="false"/>   -->
      <core:init debug="true" distributable="false"/>
      
    2. Localize as mensagens INFO associadas ao JNDI no log do servidor

      A seguir, localize as mensagens INFO associadas ao JNDI que estão impressas no log do servidor quando o aplicativo é implantado. As mensages vinculadas ao JNIDI devem parecer-se com o seguinte:
      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. Adicione os elementos do componente

      Para cada mensagem INFO vinculada ao JNDI no log, adicione um elemento component correspondente ao arquivo components.xml:
      <component class="org.jboss.seam.example.booking.AuthenticatorAction" jndi-name="java:app/jboss-seam-booking.jar/AuthenticatorAction" />
    Para mais informações sobre como depurar e resolver problemas de migração, consulte Seção 4.2.1, “Depuração e Solução de Problemas de Migração”.
    Para uma lista de problemas de migração conhecidos com os arquivos Seam 2, consulte Seção 3.2.13.2, “Problemas de Migração do Arquivo Seam 2.2 ”.
Resultado

O arquivo Seam 2.2 implanta e executa com êxito no JBoss EAP 6.