4.3.7. Fehlerbehebung und Auflösung von Seam 2.2 Booking Archive Runtime Fehlern und Ausnahmen

Im vorherigen Schritt Abschnitt 4.3.6, »Fehlerbehebung und Auflösung von Seam 2.2 Booking Archive Deployment Fehlern und Ausnahmen« haben Sie gelernt, wie Deployment Fehler behoben werden. In diesem Schritt beheben wird jeden Runtime Fehler, dem Sie begegnen.

Wichtig

Applikationen, die Hibernate direkt mit Seam 2.2 verwenden, können eine innerhalb der Applikation gepackte Version von Hibernate 3 verwenden. Hibernate 4, welches mittels des org.hibernate Moduls der JBoss EAP 6 bereitgestellt wird, wird von Seam 2.2 nicht unterstützt. Dieses Beispiel soll Ihnen dabei helfen, Ihre Applikation auf der JBoss EAP 6 in Betrieb zu nehmen. Bitte beachten Sie, dass das Packen von Hibernate 3 mit einer Seam 2.2 Applikation keine unterstützte Konfiguration ist.

Prozedur 4.11. Fehlerbehebung und Auflösung von Runtime-Fehlern und Ausnahmen

An diesem Punkt sehen Sie beim Deployment der Applikation keine Fehler im Protokoll. Wenn Sie jedoch auf die Applikations-URL zugreifen, so erscheinen Fehler im Protokoll.
  1. Problem - javax.naming.NameNotFoundException: Name 'jboss-seam-booking' not found in context ''
    Wenn Sie auf die URL http://localhost:8080/seam-booking/ in einem Browser zugreifen, so wird "The page isn't redirecting properly" gemeldet und das Protokoll enthält den folgenden Fehler:
    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 ...)
    
    Das bedeutet:

    Eine NameNotFoundException deutet ein Problem bei der JNDI-Namensgebung an. Die Regeln für die JNDI-Namensgebung haben sich bei der JBoss EAP 6 geändert, so dass Sie die Lookup-Namen bearbeiten müssen, damit diese den neuen Regeln folgen.

    So beseitigen Sie das Problem:

    Um diesen Fehler zu beheben, sehen Sie im Serverprotokoll nach, welches JNDI-Binding verwendet wurde. Im Serverprotokoll sehen Sie dies:

    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 ...]
    
    Insgesamt sind acht INFO JNDI-Bindings im Protokoll aufgeführt, eines für jedes Session-Bean: RegisterAction, BookingListAction, HotelBookingAction, AuthenticatorAction, ChangePasswordAction, HotelSearchingAction, EjbSynchronizations und TimerServiceDispatcher. Sie müssen die lib/components.xml-Datei des WARs so bearbeiten, dass es die neuen JNDI-Bindings verwendet. Beachten Sie bitte, dass im Protokoll die EJB JNDI-Bindings alle mit "java:app/jboss-seam-booking.jar" beginnen. Ersetzen Sie das core:init-Element wie folgt:
    <!--     <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"/>
    
    Als nächstes müssen Sie die EjbSynchronizations und TimerServiceDispatcher JNDI-Bindings hinzufügen. Fügen Sie der Datei die folgenden Komponentenelemente hinzu:
    <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"/>
    
    Die components.xml-Datei sollte jetzt wie folgt aussehen:
    <?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>
    

    Deployen Sie die Applikation, indem Sie die standalone/deployments/jboss-seam-booking.ear.failed-Datei löschen und eine leere jboss-seam-booking.ear.dodeploy-Datei in demselben Verzeichnis erstellen.
  2. Problem - Die Applikation deployt und läuft ohne Fehler. Wenn Sie auf die URL http://localhost:8080/seam-booking/ in einem Browser zugreifen und versuchen sich anzumelden, wird es mit der Meldung "Anmeldung fehlgeschlagen. Transaktion fehlgeschlagen." scheitern. Sie sollten eine Exception Trace im Serverprotokoll sehen:
    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]
    ...
    
    Das bedeutet:

    Die ClassNotFoundException weist auf eine fehlende Hibernate Bibliothek hin. In diesem Fall ist es das hibernate-core.jar.

    So beseitigen Sie das Problem:

    Kopieren Sie das hibernate-core.jar JAR aus dem EAP5_HOME/seam/lib/ Verzeichnis ins jboss-seam-booking.ear/lib Verzeichnis.

    Deployen Sie die Applikation, indem Sie die standalone/deployments/jboss-seam-booking.ear.failed-Datei löschen und eine leere jboss-seam-booking.ear.dodeploy-Datei in demselben Verzeichnis erstellen.
  3. Problem - Die Applikation deployt und läuft ohne Fehler. Wenn Sie auf die URL http://localhost:8080/seam-booking/ in einem Browser zugreifen, können Sie sich erfolgreich anmelden. Wenn Sie aber versuchen ein Hotel zu buchen, sehen Sie eine Exception Trace.
    Um diesen Fehler zu bereinigen müssen Sie zuerst das jboss-seam-booking.ear/jboss-seam-booking.war/WEB-INF/lib/jboss-seam-debug.jar entfernen, da es den wahren Fehler verdeckt. An dieser Stelle sollten Sie folgenden Fehler sehen:
    java.lang.NoClassDefFoundError: org/hibernate/annotations/common/reflection/ReflectionManager
    Das bedeutet:

    Der NoClassDefFoundError weist auf eine fehlende Hibernate Bibliothek hin.

    So beseitigen Sie das Problem:

    Kopieren Sie die hibernate-annotations.jar und hibernate-commons-annotations.jar JARs aus dem EAP5_HOME/seam/lib/ Verzeichnis ins jboss-seam-booking.ear/lib Verzeichnis.

    Deployen Sie die Applikation, indem Sie die standalone/deployments/jboss-seam-booking.ear.failed-Datei löschen und eine leere jboss-seam-booking.ear.dodeploy-Datei in demselben Verzeichnis erstellen.
  4. Runtime- und Applikationsfehler sollten behoben sein.
    An diesem Punkt deployt und läuft die Applikation ohne Fehler.