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” , você aprendeu como depurar os erros de implantação. Nessa etapa, você depura e resolve cada erro do período de execução que encontrar.

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

Nessas alturas, quando você implantar o aplicativo você não vê quaisquer erros no log. No entanto, quando você acessar o U>RL do aplicativo, os erros apareceram no log.
  1. Problema - javax.naming.NameNotFoundException: Name 'jboss-seam-booking' not found in context ''
    Quando você acessa o URL http://localhost:8080/seam-booking/ num navegador, você obterá uma mensagem "A página não está redirecionando a propriedade" 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 Enterprise Application Plataform 6, de forma que você precisa modificar os nomes de busca para seguir as novas regras.

    Como resolver isto:

    Para depurar isto, observe no rastreamento do log servidor antecedente ao que o JNDI binding foi usado. Você poderá 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 NFO JNDI bindings listados no log, um para cada bean: RegisterAction, BookingListAction, HotelBookingAction, AuthenticatorAction, ChangePasswordAction, HotelSearchingAction, EjbSynchronizations, and TimerServiceDispatcher. Você precisa 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, você precisa adicionar 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 deletando o arquivo standalone/deployments/jboss-seam-booking.ear.failed e criando um arquivo jboss-seam-booking.ear.dodeploy vazio no mesmo diretório.
  2. Erros do período de execução que devem ser resolvidos.
    A partir daqui, o seu aplicativo implanta e executa sem erro. Quando você acessar o URL http://localhost:8080/seam-booking/ num navegador, você estará apto a entrar com êxito.