3.2.11. Aplicativos Seam 2.2 de Migração

3.2.11.1. Migração dos Arquivos Seam 2.2 para o JBoss Enterprise Application Plataform 6

Visão Geral

Quando você migrar 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 quaisquer dependências em arquivos que não lançam o JBoss Enterprise Application Plataform 6 e copiar quaisquer JARs dependentes no diretório lib/ do aplicativo.

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 Enterprise Application Plataform 6, não é suportado pelo Seam 2.2. Esta amostra possui por intenção ajudá-lo executar o seu aplicativo no JBoss Enterprise Application Plataform 6 como primeira etapa. Por favor certifique-se de que o empacotamento do Hibernate 3 com o aplicativo Seam 2.2 não é uma configuração suportada.

Procedimento 3.27. Migração dos Arquivos Seam 2.2

  1. Atualização da configuração da fonte de dados

    Algumas das amostras Seam 2.2 usam a fonte de dados JDBC default nomeada java:/ExampleDS. A fonte de dados default foi alterada no JBoss Enterprise Application Plataform 6 para java:jboss/datasources/ExampleDS. Caso seu aplicativo usar a fonte de dados da amostra, você pode realizar o seguinte:
    • Caso você deseje usar um banco de dados de amostra que lança o JBoss Enterprise Application Plataform 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 de amostra:
      <!-- <jta-data-source>java:/ExampleDS</jta-data-source> -->
      <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
      
    • Caso você preferir manter um 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 a sua alteração ser persistente na iniciação do servidor.
      A seguinte definição é uma cópia da fonte de dados HSQL default definida no JBoss Enterprise Application Plataform 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 jbossadmin. Segue abaixo uma amostra da sintaxe que você deve usar para adicionar a fonte de dados. O "\" no final da linha indica a continuação do comando na linha seguinte.

      Exemplo 3.1. Amostra da sintaxe para 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
      
    Para maiores informações de como configurar a fonte de dados, consulte a Seção 3.1.6.2, “Atualização da Configuração da Fonte de Dados”.
  2. Adição de quaisquer dependências requeridas

    Uma vez que os aplicativos Seam 2.2 usam o JSF 1.2, você precisa adicionar dependências para os módulos JSF 1.2 e excluir os módulos JSF 2.0. Para completar este procedimento, 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>
    
    Caso seu aplicativo usar frameworks de registro em log de terceiros, você precisa adicionar as dependências descritas na: Seção 3.1.4.1, “Modificação das Dependências de Registro em Log”.
  3. Caso o seu aplicativo usar o Hibernate 3.x, primeiro tente executar o aplicativo usando as bibliotecas do Hibernate 4

    Caso o seu aplicativo não usar o Contexto Persistente Gerenciado Seam, busca Hibernate, validação ou quaisquer outros recursos com o Hibernate 4, você pode estar apto a executar com as bibliotecas do Hibernate 4. No entanto, caso você observar o ClassNotFoundExceptions ou ClassCastExceptions que direcionam às classes Hibernate ou verificar erros similares aos seguintes, você terá que seguir as instruções da próxima etapa e modificar o seu aplicativo para uso das 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. Cópia dos arquivos dependentes a partir dos frameworks externos ou de outras localizações

    Caso o seu aplicativo usar o Hibernate 3.x e você não estiver apto a usar o Hibernate 4 com sucesso no seu aplicativo, você precisará usar uma cópia do Hibernate 3-x JARs no diretório /lib e excluir o módulo Hibernate na seção de implantações do META-INF/jboss-deployment-structure.xml, conforme o seguinte:
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
     <deployment>
       <exclusions>
         <module name="org.hibernate"/>
       </exclusions>
     <deployment>
    </jboss-deployment-structure>
    
    Não existe nenhuma etapa adicional que você deve realizar quando você aplicar o bundle no seu aplicativo. Consulte a Seção 3.2.2.2, “Configuração das Alterações para Aplicativos que usam o Hibernate e o JPA” para maiores informações.
  5. Depuração e resolução dos erros Seam 2.2 JNDI

    Quando você migrar o aplicativo Seam 2.2, você poderá ver erros javax.naming.NameNotFoundException no log conforme o seguinte:
    javax.naming.NameNotFoundException: Name 'jboss-seam-booking' not found in context ''
    Caso você não deseje modificar as pesquisas JNDI através do código, você pode modificar o arquivo components.xml do aplicativo, conforme abaixo:
    1. Substituição do elemento core-init existente

      Primeiro, você pode substituir o elemento core-init existente, conforme abaixo:
      <!-- <core:init jndi-pattern="jboss-seam-booking/#{ejbName}/local" debug="true" distributable="false"/>   -->
      <core:init debug="true" distributable="false"/>
      
      
    2. Encontre as mensagens INFO JNDI binding INFO no log do servidor

      A seguir, encontre as mensagens INFO binding JNDI que são emitidas no log do servidor quando o aplicativo é implantado. As mensages binding 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. Adição dos elementos do componente

      Para cada mensagem INFO binding JNIDI, 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 maiores informações sobre como depurar e resolver os problemas de migração, consulte a Seção 4.2.1, “Depuração e Solução dos Problemas de Migração”.
    Para uma lista de problemas de migração conhecidos com os arquivos, consulte a Seção 3.2.11.2, “Problemas de Migração do Seam 2.2 Archive”.
Resultado

O arquivo Seam 2.2 é implantado e executado com êxito no JBoss Enterprise Application Plataform 6.