4.3.7. Déboguer et résoudre les Erreurs de runtime et les Exceptions de Seam 2.2 Booking Archive
Important
Procédure 4.11. Déboguer et résoudre les erreurs et les exceptions de runtime
- Problème - javax.naming.NameNotFoundException: Name 'jboss-seam-booking' not found in context ''Quand vous accédez à l'URL http://localhost:8080/seam-booking/ dans un navigateur, vous obtenez "The page isn't redirecting properly" et le journal contient l'erreur suivante :
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 ...)
Ceci signifie :L'exception
NameNotFoundException
indique un problème de nommage JNDI. Les règles de nommage JNDI ont changé dans JBoss EAP 6, donc vous devrez modifier les noms de recherche pour qu'ils se conforment aux nouvelles règles.Comment résoudre ceci :Pour déboguer ceci, regardez plus haut dans le suivi du journal serveur quelle liaison JNDI a été utilisée. En regardant le journal de serveur vous verrez ceci :
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 ...]
Il y a un total de huit liaisons INFO JNDI figurant dans le journal, un pour chaque bean de session : RegisterAction, BookingListAction, HotelBookingAction, AuthenticatorAction, ChangePasswordAction, HotelSearchingAction, EjbSynchronizations et TimerServiceDispatcher. Vous devez modifier le fichierlib/components.xml
du WAR pour utiliser les nouvelles liaisons JNDI. Dans le journal, notez que toutes les liaisons EJB JNDI commencent avec "java: app / jboss-couture-booking.jar". Remplacer l'élémentcore:init
comme suit :<!-- <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"/>
Ensuite, vous devrez ajouter les liaisons JNDI EjbSynchronizations et TimerServiceDispatcher. Ajouter les éléments de composants suivants au fichier :<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"/>
Le fichier components.xml devrait ressembler à ce qui suit :<?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>
Redéployer l'application en effaçant le fichierstandalone/deployments/jboss-seam-booking.ear.failed
et en créant un fichier videjboss-seam-booking.ear.dodeploy
dans le même répertoire. - Problème - À ce moment là, l'application se déploie et exécute sans erreur. Quand vous accédez à l'URL http://localhost:8080/seam-booking/ dans un navigateur et que vous essayez de vous connecter, vous n'y parviendrez pas, et le message suivant "Login failed. Transaction failed." apparaîtra. Vous devriez en voir une trace dans la journalisation serveur :
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] ...
Ceci signifie :L'exception ClassNotFoundException indique qu'il y a une bibliothèque manquante. Dans ce cas là, il s'agit de
hibernate-core.jar
.Comment résoudre ceci :Copier les JAR(s)
hibernate-core.jar
et le répertoireEAP5_HOME/seam/lib/
dans le répertoirejboss-seam-booking.ear/lib
.Redéployer l'application en effaçant le fichierstandalone/deployments/jboss-seam-booking.ear.failed
et en créant un fichier videjboss-seam-booking.ear.dodeploy
dans le même répertoire. - Problème - l'application se déploie et s'exécute sans erreur. Lorsque vous accédez à l'URL http://localhost:8080/seam-booking/ dans un navigateur, vous êtes capable de vous connecter. Toutefois, lorsque vous essayez de réserver une chambre d'hôtel, vous pourrez voir une trace de l'exception.Pour déboguer ceci, vous devrez supprimer
jboss-seam-booking.ear/jboss-seam-booking.war/WEB-INF/lib/jboss-seam-debug.jar
qui masque l'erreur. Puis, vous devriez voir l'erreur suivante :java.lang.NoClassDefFoundError: org/hibernate/annotations/common/reflection/ReflectionManager
Ceci signifie :L'exception NoClassDefFoundError indique qu'il manque une bibliothèque Hibernate.
Comment résoudre ceci :Copier les JAR(s)
hibernate-annotations.jar
ethibernate-commons-annotations.jar
à partir du répertoireEAP5_HOME/seam/lib/
dans le répertoirejboss-seam-booking.ear/lib
.Redéployer l'application en effaçant le fichierstandalone/deployments/jboss-seam-booking.ear.failed
et en créant un fichier videjboss-seam-booking.ear.dodeploy
dans le même répertoire. - Les erreurs de runtime et d'applications doivent être résoluesA ce point dans le temps, l'application se déploie et exécute sans erreur.Pour retourner au sujet précédent, cliquer ici : Section 4.3.4, « Migrer l'archive du Seam 2.2 Booking dans JBoss EAP 6: Instructions étape par étape »