4.3.7. Depuração e Resolução de erros e exceções do Seam 2.2 Booking Archive Runtime

Na Etapa anterior, Seção 4.3.6, “Depuração e resolução do erros e exceções do Seam 2.2 Booking Archive Deployment” , foi demonstrado como depurar os erros de implantação. Nessa etapa, será demonstrado como depurar e resolver cada erro do período de execução encontrado.

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.11. Depuração e resolução das exceções e erros do período de execução

Neste caso, quando o aplicativo é implantado os erros no log não são visíveis. No entanto, quando o URL do aplicativo for acessado, os erros aparecerão no log.
  1. Problema - javax.naming.NameNotFoundException: Name 'jboss-seam-booking' not found in context ''
    Quando um URL http://localhost:8080/seam-booking/ é acessado num navegador, a mensagem "A página não está sendo redirecionada de forma apropriada" aparece e o log contém o seguinte erro:
    SEVERE [org.jboss.seam.jsf.SeamPhaseListener] (http--127.0.0.1-8080-1) swallowing exception: java.lang.IllegalStateException: Could not start transaction
      at org.jboss.seam.jsf.SeamPhaseListener.begin(SeamPhaseListener.java:598) [jboss-seam.jar:]
      (... log messages removed ...)
    Caused by: org.jboss.seam.InstantiationException: Could not instantiate Seam component: org.jboss.seam.transaction.synchronizations
      at org.jboss.seam.Component.newInstance(Component.java:2170) [jboss-seam.jar:]
      (... log messages removed ...)
    Caused by: javax.naming.NameNotFoundException: Name 'jboss-seam-booking' not found in context ''
      at org.jboss.as.naming.util.NamingUtils.nameNotFoundException(NamingUtils.java:109)
      (... log messages removed ...)
    
    O que significa:

    Um NameNotFoundException indica um problema de nomeação JNDI. As regras de nomeação JNDI foram alteradas no JBoss EAP 6, de forma que é necessário modificar os nomes de busca para seguir as novas regras.

    Como resolver isto:

    Para depurar isto, observe o rastreamento do log servidor antecedente ao que o JNDI binding foi usado. Será possível observar o seguinte no log do servidor:

    15:01:16,138 INFO  [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-1) JNDI bindings for session bean named RegisterAction 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/RegisterAction!org.jboss.seam.example.booking.Register
      java:app/jboss-seam-booking.jar/RegisterAction!org.jboss.seam.example.booking.Register
      java:module/RegisterAction!org.jboss.seam.example.booking.Register
      java:global/jboss-seam-booking/jboss-seam-booking.jar/RegisterAction
      java:app/jboss-seam-booking.jar/RegisterAction
      java:module/RegisterAction
      [JNDI bindings continue ...]
    
    Existe o total de oito INFO JNDI bindings listados no log, um para cada bean: RegisterAction, BookingListAction, HotelBookingAction, AuthenticatorAction, ChangePasswordAction, HotelSearchingAction, EjbSynchronizations e TimerServiceDispatcher. Será necessário modificar o arquivo lib/components.xml do WAR para usar o novo JNDI bindings. No log, perceba que todos os EJB JNDI bindings iniciam com "java:app/jboss-seam-booking.jar". Substitua o elemento core:init conforme o seguinte:
    <!--     <core:init jndi-pattern="jboss-seam-booking/#{ejbName}/local" debug="true" distributable="false"/> -->
    <core:init jndi-pattern="java:app/jboss-seam-booking.jar/#{ejbName}" debug="true" distributable="false"/>
    
    
    Em seguida, adicione o EjbSynchronizations e TimerServiceDispatcher JNDI bindings. Adicione os seguintes componentes ao arquivo:
    <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"/>
    
    
    O arquivo components.xml deve parecer-se com o seguinte:
    <?xml version="1.0" encoding="UTF-8"?>
    <components xmlns="http://jboss.com/products/seam/components"
      xmlns:core="http://jboss.com/products/seam/core"
      xmlns:security="http://jboss.com/products/seam/security"
      xmlns:transaction="http://jboss.com/products/seam/transaction"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation=
        "http://jboss.com/products/seam/core http://jboss.com/products/seam/core-2.2.xsd
         http://jboss.com/products/seam/transaction http://jboss.com/products/seam/transaction-2.2.xsd
         http://jboss.com/products/seam/security http://jboss.com/products/seam/security-2.2.xsd
         http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.2.xsd">
    
        <!-- <core:init jndi-pattern="jboss-seam-booking/#{ejbName}/local" debug="true" distributable="false"/> -->
        <core:init jndi-pattern="java:app/jboss-seam-booking.jar/#{ejbName}" debug="true" distributable="false"/>
        <core:manager conversation-timeout="120000"
                      concurrent-request-timeout="500"
                      conversation-id-parameter="cid"/>
        <transaction:ejb-transaction/>
        <security:identity authenticate-method="#{authenticator.authenticate}"/>
        <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"/>
    </components>
    
    

    Reimplante o aplicativo apenas excluindo o arquivo standalone/deployments/jboss-seam-booking.ear.failed e criando um arquivo jboss-seam-booking.ear.dodeploy vazio no mesmo diretório.
  2. Problema - O aplicativo implanta e executa sem o erro. Quando acessando o URL http://localhost:8080/seam-booking/ num navegador e houver a tentativa de login, ocorrerá uma falha com a mensagem "O Login falhou. A transação falhou." Verifique um traço de exceção no log do servidor:
    13:36:04,631 WARN  [org.jboss.modules] (http-/127.0.0.1:8080-1) Failed to define class org.jboss.seam.persistence.HibernateSessionProxy in Module "deployment.jboss-seam-booking.ear.jboss-seam.jar:main" from Service Module Loader: java.lang.LinkageError: Failed to link org/jboss/seam/persistence/HibernateSessionProxy (Module "deployment.jboss-seam-booking.ear.jboss-seam.jar:main" from Service Module Loader)
    ....
    Caused by: java.lang.LinkageError: Failed to link org/jboss/seam/persistence/HibernateSessionProxy (Module "deployment.jboss-seam-booking.ear.jboss-seam.jar:main" from Service Module Loader)
    ...
    Caused by: java.lang.NoClassDefFoundError: org/hibernate/engine/SessionImplementor
    	at java.lang.ClassLoader.defineClass1(Native Method) [rt.jar:1.7.0_45]
    ...
    Caused by: java.lang.ClassNotFoundException: org.hibernate.engine.SessionImplementor from [Module "deployment.jboss-seam-booking.ear.jboss-seam.jar:main" from Service Module Loader]
    ...
    
    O que significa:

    O ClassNotFoundException indica a biblioteca Hibernate ausente. Neste caso está no hibernate-core.jar.

    Como resolver isto:

    Copie o hibernate-core.jar JAR a partir no diretório EAP5_HOME/seam/lib/ ao diretório jboss-seam-booking.ear/lib.

    Reimplante o aplicativo apenas excluindo o arquivo standalone/deployments/jboss-seam-booking.ear.failed e criando um arquivo jboss-seam-booking.ear.dodeploy vazio no mesmo diretório.
  3. Problema - O aplicativo implanta e executa sem erro. Quando acessando o URL http://localhost:8080/seam-booking/ num navegador, o login poderá ser efetuado com sucesso. No entanto, quando houver a tentiva de reservar um hotel, um traço da exceção poderá ser observado.
    Para depurar isto, primeiramente remova o jboss-seam-booking.ear/jboss-seam-booking.war/WEB-INF/lib/jboss-seam-debug.jar uma vez que isto mascara o erro verdadeiro. Neste caso, o seguinte erro poderá ser observado:
    java.lang.NoClassDefFoundError: org/hibernate/annotations/common/reflection/ReflectionManager
    O que significa:

    O NoClassDefFoundError indica a biblioteca Hibernate ausente.

    Como resolver isto:

    Copie o hibernate-annotations.jar e hibernate-commons-annotations.jar JARs a partir do diretório EAP5_HOME/seam/lib/ ao diretório jboss-seam-booking.ear/lib.

    Reimplante o aplicativo apenas excluindo o arquivo standalone/deployments/jboss-seam-booking.ear.failed e criando um arquivo jboss-seam-booking.ear.dodeploy vazio no mesmo diretório.
  4. Os erros do período de execução e aplicativo devem ser resolvidos.
    Neste caso, o aplicativo implanta e executa sem erro.