4.3.7. 调试和解决 Seam 2.2 Booking 例程的运行时错误和异常
在前面的步骤 第 4.3.6 节 “调试和解决 Seam 2.2 Booking 例程的部署错误和异常” 里,您学习了如何调试部署错误,在这个步骤里,您会调试和解决您遇到的运行时错误。
重要
直接使用 Hibernate 的 Seam 2.2 应用程序可以使用包裹在应用程序里的一个 Hibernate 3 版本。而通过 JBoss EAP 6 的 org.hibernate 模块提供的 Hibernate 4,不被 Seam 2.2 支持。这个例子将帮助您在 JBoss EAp 6 运行应用程序。请注意,将 Hibernate 3 包裹在 Seam 2.2 应用程序不是被支持的配置。
过程 4.11. 调试和解决运行时错误和异常
目前,当您部署这个应用程序时,您没有在日志里看到任何错误。但是,当您访问这个程序的 URL 是,日志里就出现了错误。
- 问题 - javax.naming.NameNotFoundException: Name 'jboss-seam-booking' not found in context ''当您通过浏览器访问 URL http://localhost:8080/seam-booking/ 时,您会看到 "The page isn't redirecting properly" 且日志会包含下列错误:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 它表示:NameNotFoundException表示了 JNDI 命名问题。JNDI 命名规则在 JBoss EAP 6 里已经进行了修改,所以您需要修改查找名称以遵循新的规则。如何解决这个问题:为了调集试,
日志里一共列出了 8 个 INFO JNDI 绑定,每个都对应一个会话 bean:RegisterAction、BookingListAction、HotelBookingAction、AuthenticatorAction、ChangePasswordAction、HotelSearchingAction、EjbSynchronizations 和 TimerServiceDispatcher。您需要修改 WAR 的Copy to Clipboard Copied! Toggle word wrap Toggle overflow lib/components.xml文件来使用新的 JNDI 绑定。在日志里,注意 EJB JNDI 绑定都以 "java:app/jboss-seam-booking.jar" 开始。请替换core:init元素:然后,您需要添加 EjbSynchronizations 和 TimerServiceDispatcher JNDI 绑定。请添加下列 component 元素到这个文件里:<!-- <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: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"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow components.xml 文件应该类似于:<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"/>
<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"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过删除standalone/deployments/jboss-seam-booking.ear.failed文件并在相同目录里创建一个空白的jboss-seam-booking.ear.dodeploy文件来重新部署应用程序。 - 问题 - 应用程序部署和运行无误。当您访问 http://localhost:8080/seam-booking/ 并试图登陆时失败,错误消息为 "Login failed. Transaction failed."。您应该在服务器日志里看到如下异常跟踪信息:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 它表示:ClassNotFoundException 表示缺失的 Hibernate 库。在这个例子里是
hibernate-core.jar。如何解决这个问题:从
EAP5_HOME/seam/lib/目录复制hibernate-core.jarJAR 到jboss-seam-booking.ear/lib目录。通过删除standalone/deployments/jboss-seam-booking.ear.failed文件并在相同目录里创建一个空白的jboss-seam-booking.ear.dodeploy文件来重新部署应用程序。 - 问题 - 应用程序部署和运行无误。当您访问 http://localhost:8080/seam-booking/,您可以成功登录。然而,当您试图预订酒店时,您会看到如下异常跟踪信息:为了进行调试,您必须首先删除
jboss-seam-booking.ear/jboss-seam-booking.war/WEB-INF/lib/jboss-seam-debug.jar,因为它标记了真正的错误。此时,您应该看到如下错误:java.lang.NoClassDefFoundError: org/hibernate/annotations/common/reflection/ReflectionManager
java.lang.NoClassDefFoundError: org/hibernate/annotations/common/reflection/ReflectionManagerCopy to Clipboard Copied! Toggle word wrap Toggle overflow 它表示:ClassNotFoundException 表示有缺失的 Hibernate 库。
如何解决这个问题:从
EAP5_HOME/seam/lib/目录复制hibernate-annotations.jar和hibernate-commons-annotations.jar到jboss-seam-booking.ear/lib目录。通过删除standalone/deployments/jboss-seam-booking.ear.failed文件并在相同目录里创建一个空白的jboss-seam-booking.ear.dodeploy文件来重新部署应用程序。 - 运行时和应用程序错误应该被解决此时,应用程序已部署且运行无误。