4.3.7. Seam 2.2 Booking アーカイブのランタイムエラーや例外のデバッグおよび解決
重要
手順4.11 ランタイムエラーや例外のデバッグおよび解決
- 問題 - 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 の命名の問題であることを示しています。JBoss EAP 6 では JNDI の命名ルールが変更になったため、新しいルールに従ってルックアップ名を変更する必要があります。解決方法これをデバッグするには、使用された JNDI バインディングに対するサーバーログトレースを確認します。サーバーログを確認すると、内容は以下のようになります。
ログには、各セッション Bean に対して 1 つずつ合計で 8 つの INFO JNDI バインディング (RegisterAction、BookingListAction、HotelBookingAction、AuthenticatorAction、ChangePasswordAction、HotelSearchingAction、EjbSynchronizations、および TimerServiceDispatcher) がリストされます。新しい JNDI バインディングを使用するよう WAR のCopy to Clipboard Copied! Toggle word wrap Toggle overflow lib/components.xml
ファイルを変更します。ログで、EJB JNDI バインディングがすべて "java:app/jboss-seam-booking.jar" で始まっていることに注意してください。以下のようにcore:init
要素を置き換えます。次に、EjbSynchronizations バインディングと TimerServiceDispatcher JNDI バインディングを追加する必要があります。ファイルに以下のコンポーネント要素を追加します。<!-- <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
ファイルを作成し、アプリケーションを再デプロイします。 - 問題 - エラーが発生せずにアプリケーションがデプロイされ、実行されます。ブラウザーで URL http://localhost:8080/seam-booking/ にアクセスし、ログインしようとすると「Login failed. Transaction failed.」 というメッセージが表示され、ログインに失敗します。サーバーログに次のような例外トレースが記録されるはずです。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ログの解説ClassNotFoundException は Hibernate ライブラリーがないことを示しています。この場合、
hibernate-core.jar
が存在しません。解決方法hibernate-core.jar
JAR をEAP5_HOME/seam/lib/
ディレクトリーからjboss-seam-booking.ear/lib
ディレクトリーへコピーします。standalone/deployments/jboss-seam-booking.ear.failed
ファイルを削除して同じディレクトリーに空のjboss-seam-booking.ear.dodeploy
ファイルを作成し、アプリケーションを再デプロイします。 - 問題 - エラーが発生せずにアプリケーションがデプロイされ、実行されます。ブラウザーで URL 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/ReflectionManager
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ログの解説NoClassDefFoundError は Hibernate ライブラリーがないことを示しています。
解決方法hibernate-annotations.jar
およびhibernate-commons-annotations.jar
JAR をEAP5_HOME/seam/lib/
ディレクトリーからjboss-seam-booking.ear/lib
ディレクトリーへコピーします。standalone/deployments/jboss-seam-booking.ear.failed
ファイルを削除して同じディレクトリーに空のjboss-seam-booking.ear.dodeploy
ファイルを作成し、アプリケーションを再デプロイします。 - ランタイムおよびアプリケーションエラーが解決されるはずです。この時点で、エラーが発生せずにアプリケーションがデプロイおよび実行されます。以前のトピックに戻るには、「Seam 2.2 Booking アーカイブの JBoss EAP 6 への移行: 手順説明」をクリックしてください。