Menu Close

4.3.7. Seam 2.2 Booking アーカイブのランタイムエラーや例外のデバッグおよび解決

前述の手順、「Seam 2.2 Booking アーカイブのデプロイメントエラーや例外のデバッグおよび解決」 ではデプロイメントエラーのデバッグ方法について説明しました。この手順では発生したランタイムエラーをデバッグし解決します。

重要

この例は、最初にアプリケーションを JBoss Enterprise Application Platform 6 上で実行できるようにすることを目的としています。この設定はサポート対象ではなく、Hibernate 4 を使用するよう次の手順でアプリケーションをアップグレードする必要があります。

手順4.17 ランタイムエラーや例外のデバッグおよび解決

この時点では、アプリケーションをデプロイしてもログにエラーは記録されていませんが、アプリケーション の URL にアクセスするとエラーがログに記録されます。
  1. 問題 - javax.naming.NameNotFoundException: Name 'jboss-seam-booking' not found in context ''
    ブラウザーで URL http://localhost:8080/seam-booking/ にアクセスすると 「The page isn't redirecting properly」と表示され、ログに次のエラーが記録されます。
    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 ...)
    
    ログの解説

    NameNotFoundException は JNDI の命名の問題であることを示しています。JBoss Enterprise Application Platform 6 では JNDI の命名ルールが変更になったため、新しいルールに従ってルックアップ名を変更する必要があります。

    解決方法

    この問題をデバッグするには、サーバーログを追跡し、問題発生前に使用された JNDI バインディングを確認します。サーバーログには以下が記録されているはずです。

    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 ...]
    
    セッション Bean ごとに 1つとなる合計 8 つの INFO JNDI バインディング (RegisterAction、 BookingListAction, HotelBookingAction、 AuthenticatorAction、 ChangePasswordAction、 HotelSearchingAction、 EjbSynchronizations、 TimerServiceDispatcher) がログに記録されています。新しい JNDI バインディングを使用するよう、WAR の lib/components.xml ファイルを変更する必要があります。ログの EJB JNDI バインディングはすべて「java:app/jboss-seam-booking.jar」で始まることに注意してください。 次のように core:init 要素を置き換えます。
    <!--     <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"/>
    
    次に、EjbSynchronizations と TimerServiceDispatcher JNDI バインディングを追加する必要があります。ファイルに次のコンポーネント要素を追加します。
    <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.xml ファイルは次のようになるはずです。
    
    <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>
    

    standalone/deployments/jboss-seam-booking.ear.failed ファイルを削除して同じディレクトリに空の jboss-seam-booking.ear.dodeploy ファイルを作成し、アプリケーションを再デプロイします。
  2. ランタイムエラーの解決
    この時点で、アプリケーションはエラーを引き起こさずにデプロイされ実行されます。ブラウザーで URL http://localhost:8080/seam-booking/ にアクセスすると正常にログインすることができます。
    前のトピックに戻るには 「Seam 2.2 Booking アーカイブの JBoss Enterprise Application 6 への移行: 手順説明」 をクリックしてください。