4.3.7. Depuração e Resolução de erros e exceções do Seam 2.2 Booking Archive Runtime
Importante
Procedimento 4.11. Depuração e resolução das exceções e erros do período de execução
- 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 arquivolib/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 elementocore: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 arquivostandalone/deployments/jboss-seam-booking.ear.failed
e criando um arquivojboss-seam-booking.ear.dodeploy
vazio no mesmo diretório. - 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órioEAP5_HOME/seam/lib/
ao diretóriojboss-seam-booking.ear/lib
.Reimplante o aplicativo apenas excluindo o arquivostandalone/deployments/jboss-seam-booking.ear.failed
e criando um arquivojboss-seam-booking.ear.dodeploy
vazio no mesmo diretório. - 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
ehibernate-commons-annotations.jar
JARs a partir do diretórioEAP5_HOME/seam/lib/
ao diretóriojboss-seam-booking.ear/lib
.Reimplante o aplicativo apenas excluindo o arquivostandalone/deployments/jboss-seam-booking.ear.failed
e criando um arquivojboss-seam-booking.ear.dodeploy
vazio no mesmo diretório. - Os erros do período de execução e aplicativo devem ser resolvidos.Neste caso, o aplicativo implanta e executa sem erro.Clique na Seção 4.3.4, “Migração do Seam 2.2 Booking Archive ao JBoss EAP 6: Instruções de Etapa-por-Etapa” para retornar ao tópico anterior.