4.3.7. Depuración y resolución de errores y excepciones en tiempo de ejecución del archivador de reservas Seam 2.2
Importante
Procedimiento 4.11. Depuración y resolución de excepciones y errores en tiempo de ejecución
- Emita - javax.naming.NameNotFoundException: Name 'jboss-seam-booking' not found in context ''Cuando accede la URL http://localhost:8080/seam-booking/ en un navegador, obtiene un mensaje que dice "La página no está redireccionando apropiadamente" y el registro contiene el siguiente error:
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 ...)
Lo que significa:Una
NameNotFoundExceptionindica un problema de nombrado JNDI. Las reglas de nombrado JNDI han cambiado en JBoss EAP 6 así que necesita modificar los nombres de búsqueda para seguir las nuevas reglas.Para resolverlo:Para depurar esto, busque en la parte anterior del rastro del registro del servidor para ver qué enlace JNDI se utilizó. Al mirar en el registro del servidor puede ver esto:
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 ...]
Hay un total de ocho enlaces INFO JNDI listados en el registro, uno para cada bean de sesión: RegisterAction, BookingListAction, HotelBookingAction, AuthenticatorAction, ChangePasswordAction, HotelSearchingAction, EjbSynchronizations y TimerServiceDispatcher. Necesita modificar el archivolib/components.xmldel WAR para usar los nuevos enlaces JNDI. En el registro, note que todos los enlaces EJB JNDI empienzan por "java:app/jboss-seam-booking.jar" Reemplace el elementocore:initasí:<!-- <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"/>Luego, necesita agregar los enlaces JNDI EjbSynchronizations y TimerServiceDispatcher. Agregue los siguientes elementos de componente al archivo:<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"/>
El archivo components.xml ahora se debe ver así:<?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>Vuelva a implementar la aplicación borrando el archivostandalone/deployments/jboss-seam-booking.ear.failedy creando un archivo en blancojboss-seam-booking.ear.dodeployen el mismo directorio. - Problema - la aplicación se implementa y ejecuta sin errores. Cuando accede la URL http://localhost:8080/seam-booking/ en un navegador y trata de iniciar sesión, falla y presenta el mensaje "Inicio de sesión fallido. Transacción fallida". Debe ver un rastro de excepción en el registro del 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] ...
Lo que significa:La ClassNotFoundException indica que falta una biblioteca Hibernate. En este caso es la
hibernate-core.jar.Para resolverlo:Copie la JAR
hibernate-core.jardel directorioEAP5_HOME/seam/lib/al directoriojboss-seam-booking.ear/lib.Vuelva a implementar la aplicación borrando el archivostandalone/deployments/jboss-seam-booking.ear.failedy creando un archivo en blancojboss-seam-booking.ear.dodeployen el mismo directorio. - Problema - la aplicación se implementa y ejecuta sin errores. Cuando accede la URL http://localhost:8080/seam-booking/ en un navegador, puede iniciar sesión de manera exitosa. Sin embargo, cuando trata de reservar un hotel verá un rastro de excepción.Para depurar esto, primero debe borrar la
jboss-seam-booking.ear/jboss-seam-booking.war/WEB-INF/lib/jboss-seam-debug.jarya que enmascara el error verdadero. En este momento debe ver el siguiente error:java.lang.NoClassDefFoundError: org/hibernate/annotations/common/reflection/ReflectionManager
Lo que significa:La NoClassDefFoundError indica que falta una biblioteca Hibernate.
Para resolverlo:Copie las JARs
hibernate-annotations.jaryhibernate-commons-annotations.jardel directorioEAP5_HOME/seam/lib/al directoriojboss-seam-booking.ear/lib.Vuelva a implementar la aplicación borrando el archivostandalone/deployments/jboss-seam-booking.ear.failedy creando un archivo en blancojboss-seam-booking.ear.dodeployen el mismo directorio. - Se deben resolver los errores de tiempo de ejecución y de las aplicacionesEn este punto, la aplicación se implementa y ejecuta sin errores.Para regresar al tema anterior haga clic aquí: Sección 4.3.4, “Migración del archivador de reservas de Seam 2.2 a JBoss EAP 6: instrucciones paso por paso”