4.3.6. Déboguer et résoudre les Erreurs de déploiement et les Exceptions de Seam 2.2 Booking Archive

Dans l'étape précédente, Section 4.3.5, « Générer et déployer la version JBoss EAP 5.X de l'application Seam 2.2 Booking », vous avez créé l'application JBos EAP 5.X Seam 2.2 Booking et vous l'avez déployée dans le dossier de déploiement JBoss EAP 6. Au cours de cette étape, vous avez résolu et débogué chaque erreur de déploiement que vous avez rencontrée.

Important

Les applications qui utilisent Hibernate directement avec Seam 2.2 utilisent sans doute une version d'Hibernate 3 empaquetée dans l'application. Hibernate 4, fourni par le module org.hibernate de JBoss EAP 6, n'est pas pris en charge par Seam 2.2. Cet exemple a pour but de vous aider à exécuter votre application dans JBoss EAP 6 comme première étape. Notez qu'empaqueter Hibernate 3 avec une application Seam 2.2 n'est pas une configuration prise en charge.

Procédure 4.10. Déboguer et résoudre les erreurs et les exceptions de déploiement

  1. Problème - java.lang.ClassNotFoundException: javax.faces.FacesException
    Quand vous déployez l'application, le journal contient l'erreur suivante :
    ERROR \[org.jboss.msc.service.fail\] (MSC service thread 1-1) MSC00001: Failed to start service jboss.deployment.subunit."jboss-seam-booking.ear"."jboss-seam-booking.war".POST_MODULE:
    org.jboss.msc.service.StartException in service jboss.deployment.subunit."jboss-seam-booking.ear"."jboss-seam-booking.war".POST_MODULE:
    Failed to process phase POST_MODULE of subdeployment "jboss-seam-booking.war" of deployment "jboss-seam-booking.ear"
        (.. additional logs removed ...)
    Caused by: java.lang.ClassNotFoundException: javax.faces.FacesException from \[Module "deployment.jboss-seam-booking.ear:main" from Service Module Loader\]
        at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:191)
    
    Ceci signifie :

    L'exception ClassNotFoundException indique une dépendance manquante. Dans ce cas, impossible de trouver la classe javax.faces.FacesException et vous devez donc ajouter explicitement la dépendance.

    Comment résoudre ceci :

    Chercher le nom du module pour cette classe dans le répertoire EAP6_HOME/modules/system/layers/base/ à l'aide d'un chemin d'accès qui corresponde à la classe manquante. Dans ce cas, vous trouverez 2 modules qui correspondent :

    javax/faces/api/main
    javax/faces/api/1.2
    
    Les deux modules ont le même nom de module : javax.faces.api mais un d'entre eux, qui se trouve dans le répertoire principal, est pour JSF 2.0 et l'autre, situé dans le répertoire 1.2, est pour JSF 1.2. S'il n'y avait qu'un seul module disponible, vous pourriez simplement créer un fichier MANIFEST.MF et ajouter la dépendance de module. Mais, dans ce cas, vous devez utiliser la version JSF 1.2 et non pas la version 2.0 du répertoire principal, donc vous devez en spécifier une et exclure l'autre. Pour ceci, créer un fichier jboss-deployment-structure.xml dans le répertoire META-INF/ de l'EAR qui contiendra les données suivantes :
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
      <deployment>
          <dependencies>
            <module name="javax.faces.api" slot="1.2" export="true"/>
          </dependencies>
      </deployment>
      <sub-deployment name="jboss-seam-booking.war">
        <exclusions>
            <module name="javax.faces.api" slot="main"/>
          </exclusions>
          <dependencies>
            <module name="javax.faces.api" slot="1.2"/>
          </dependencies>
      </sub-deployment>
    </jboss-deployment-structure>
    
    Dans la section deployment, vous ajoutez la dépendance pour l'API javax.faces.api du module JSF 1.2. Vous ajoutez aussi la dépendance du module JSF 1.2 dans la section de sous-déploiement du WAR et vous excluez le module JSF 2.0.

    Redéployer l'application en effaçant le fichier EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed et en créant un fichier vide jboss-seam-booking.ear.dodeploy dans le même répertoire.
  2. Problème - java.lang.ClassNotFoundException: org.apache.commons.logging.Log
    Quand vous déployez l'application, le journal contient l'erreur suivante :
    ERROR [org.jboss.msc.service.fail] (MSC service thread 1-8) MSC00001: Failed to start service jboss.deployment.unit."jboss-seam-booking.ear".INSTALL:
    org.jboss.msc.service.StartException in service jboss.deployment.unit."jboss-seam-booking.ear".INSTALL:
    Failed to process phase INSTALL of deployment "jboss-seam-booking.ear"
        (.. additional logs removed ...)
    Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.Log from [Module "deployment.jboss-seam-booking.ear.jboss-seam-booking.war:main" from Service Module Loader]
    
    Ceci signifie :

    L'exception ClassNotFoundException indique une dépendance manquante. Dans ce cas, impossible de trouver la classe org.apache.commons.logging.Log et vous devez donc ajouter explicitement la dépendance.

    Comment résoudre ceci :

    Chercher le nom du module pour cette classe dans le répertoire EAP6_HOME/modules/system/layers/base/ en cherchant un chemin d'accès qui corresponde à la classe manquante. Dans ce cas, vous trouverez un module qui correspond au chemin org/apache/commons/logging/. Le nom du module est “org.apache.commons.logging”.

    Modifier le fichier jboss-deployment-structure.xml pour ajouter la dépendance de module à la section de déploiement du fichier.
    <module name="org.apache.commons.logging" export="true"/>
    
    Le fichier jboss-deployment-structure.xml devrait maintenant ressembler à ceci :
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
      <deployment>
          <dependencies>
            <module name="javax.faces.api" slot="1.2" export="true"/>
            <module name="org.apache.commons.logging" export="true"/>
          </dependencies>
      </deployment>
      <sub-deployment name="jboss-seam-booking.war">
        <exclusions>
            <module name="javax.faces.api" slot="main"/>
          </exclusions>
          <dependencies>
            <module name="javax.faces.api" slot="1.2"/>
          </dependencies>
      </sub-deployment>
    </jboss-deployment-structure>
    
    Redéployer l'application en effaçant le fichier EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed et en créant un fichier vide jboss-seam-booking.ear.dodeploy dans le même répertoire.
  3. Problème - java.lang.ClassNotFoundException: org.dom4j.DocumentException
    Quand vous déployez l'application, le journal contient l'erreur suivante :
    ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/seam-booking]] (MSC service thread 1-3) Exception sending context initialized event to listener instance of class org.jboss.seam.servlet.SeamListener: java.lang.NoClassDefFoundError: org/dom4j/DocumentException
        (... additional logs removed ...)
    Caused by: java.lang.ClassNotFoundException: org.dom4j.DocumentException from [Module "deployment.jboss-seam-booking.ear.jboss-seam.jar:main" from Service Module Loader]
    
    Ceci signifie :

    L'exception ClassNotFoundException indique une dépendance manquante. Dans ce cas, impossible de trouver la classe org.dom4j.DocumentException.

    Comment résoudre ceci :

    Trouver le nom de module dans le répertoire EAP6_HOME/modules/system/layers/base/ en cherchant org/dom4j/DocumentException. Le nom du module est “org.dom4j”. Modifier le fichier jboss-deployment-structure.xml pour ajouter la dépendance de module à la section de déploiement du fichier.

    <module name="org.dom4j" export="true"/>
    
    Le jboss-deployment-structure.xml devrait maintenant ressembler à ceci :
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
      <deployment>
          <dependencies>
            <module name="javax.faces.api" slot="1.2" export="true"/>
            <module name="org.apache.commons.logging" export="true"/>
                <module name="org.dom4j" export="true"/>
              </dependencies>
      </deployment>
      <sub-deployment name="jboss-seam-booking.war">
        <exclusions>
            <module name="javax.faces.api" slot="main"/>
          </exclusions>
          <dependencies>
            <module name="javax.faces.api" slot="1.2"/>
          </dependencies>
      </sub-deployment>
    </jboss-deployment-structure>
    

    Redéployer l'application en effaçant le fichier EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed et en créant un fichier vide jboss-seam-booking.ear.dodeploy dans le même répertoire.
  4. Problème - java.lang.ClassNotFoundException: org.hibernate.validator.InvalidValue
    Quand vous déployez l'application, le journal contient l'erreur suivante :
    ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/seam-booking]] (MSC service thread 1-6) Exception sending context initialized event to listener instance of class org.jboss.seam.servlet.SeamListener: java.lang.RuntimeException: Could not create Component: org.jboss.seam.international.statusMessages
        (... additional logs removed ...)
    Caused by: java.lang.ClassNotFoundException: org.hibernate.validator.InvalidValue from [Module "deployment.jboss-seam-booking.ear.jboss-seam.jar:main" from Service Module Loader]
    
    Ceci signifie :

    L'exception ClassNotFoundException indique une dépendance manquante. Dans ce cas, impossible de trouver la classe org.hibernate.validator.InvalidValue.

    Comment résoudre ceci :

    Il y a un module “org.hibernate.validator”, mais le JAR ne contient pas la classe org.hibernate.validator.InvalidValue, donc si on ajoute la dépendance de module, on ne résout pas le problème. Dans un tel cas, le JAR qui contient la classe faisait partie du déploiement de JBoss EAP 5.X. Chercher le JAR qui contient la classe manquante dans le répertoire EAP5_HOME/seam/lib/. Pour cela, ouvrir la console et tapez ce qui suit :

    $ cd EAP5_HOME/seam/lib
    $ grep 'org.hibernate.validator.InvalidValue' `find . -name '*.jar'`
    
    Résultat :
    $ Binary file ./hibernate-validator.jar matches
    $ Binary file ./test/hibernate-all.jar matches
    
    Dans ce cas, copier hibernate-validator.jar dans le répertoire jboss-seam-booking.ear/lib/ :
    $ cp EAP5_HOME/seam/lib/hibernate-validator.jar jboss-seam-booking.ear/lib
    

    Redéployer l'application en effaçant le fichier EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed et en créant un fichier vide jboss-seam-booking.ear.dodeploy dans le même répertoire.
  5. Problème - java.lang.InstantiationException: org.jboss.seam.jsf.SeamApplicationFactory
    Quand vous déployez l'application, le journal contient l'erreur suivante :
    INFO  [javax.enterprise.resource.webcontainer.jsf.config] (MSC service thread 1-7) Unsanitized stacktrace from failed start...: com.sun.faces.config.ConfigurationException: Factory 'javax.faces.application.ApplicationFactory' was not configured properly.
      at com.sun.faces.config.processor.FactoryConfigProcessor.verifyFactoriesExist(FactoryConfigProcessor.java:296) [jsf-impl-2.0.4-b09-jbossorg-4.jar:2.0.4-b09-jbossorg-4]
      (... additional logs removed ...)
    Caused by: javax.faces.FacesException: org.jboss.seam.jsf.SeamApplicationFactory
      at javax.faces.FactoryFinder.getImplGivenPreviousImpl(FactoryFinder.java:606) [jsf-api-1.2_13.jar:1.2_13-b01-FCS]
      (... additional logs removed ...)
      at com.sun.faces.config.processor.FactoryConfigProcessor.verifyFactoriesExist(FactoryConfigProcessor.java:294) [jsf-impl-2.0.4-b09-jbossorg-4.jar:2.0.4-b09-jbossorg-4]
      ... 11 more
    Caused by: java.lang.InstantiationException: org.jboss.seam.jsf.SeamApplicationFactory
      at java.lang.Class.newInstance0(Class.java:340) [:1.6.0_25]
      at java.lang.Class.newInstance(Class.java:308) [:1.6.0_25]
      at javax.faces.FactoryFinder.getImplGivenPreviousImpl(FactoryFinder.java:604) [jsf-api-1.2_13.jar:1.2_13-b01-FCS]
      ... 16 more
    
    Ceci signifie :

    Les com.sun.faces.config.ConfigurationException et java.lang.InstantiationException indiquent un problème de dépendance. Dans un tel cas, la cause n'est pas évidente.

    Comment résoudre ceci :

    Il vous faut trouver le module qui contient les classes com.sun.faces. Malgré qu'il n'y ait pas de module com.sun.faces, il y a deux modules com.sun.jsf-impl. Une simple vérification du jsf-impl-1.2_13.jar dans le répertoire 1.2 révèle qu'il contient les classes com.sun.faces. Comme avec les exceptions javax.faces.FacesException ClassNotFoundException, vous devez utiliser la version JSF 1.2 et non pas la version JSF 2.0 dans le principal, donc vous devrez en indiquer une et en exclure l'autre. Vous devrez modifier le fichier jboss-deployment-structure.xml pour ajouter la dépendance de module à la section de déploiement du fichier. Vous devrez aussi y ajouter le sous-déploiement du WAR et exclure le module JSF 2.0. Le fichier devrait ressembler à ceci :

    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
      <deployment>
          <dependencies>
            <module name="javax.faces.api" slot="1.2" export="true"/>
                  <module name="com.sun.jsf-impl" slot="1.2" export="true"/>
            <module name="org.apache.commons.logging" export="true"/>
            <module name="org.dom4j" export="true"/>
          </dependencies>
      </deployment>
      <sub-deployment name="jboss-seam-booking.war">
        <exclusions>
            <module name="javax.faces.api" slot="main"/>
            <module name="com.sun.jsf-impl" slot="main"/>
          </exclusions>
          <dependencies>
            <module name="javax.faces.api" slot="1.2"/>
                  <module name="com.sun.jsf-impl" slot="1.2"/>
          </dependencies>
      </sub-deployment>
    </jboss-deployment-structure>

    Redéployer l'application en effaçant le fichier EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed et en créant un fichier vide jboss-seam-booking.ear.dodeploy dans le même répertoire.
  6. Problème - java.lang.ClassNotFoundException: org.apache.commons.collections.ArrayStack
    Quand vous déployez l'application, le journal contient l'erreur suivante :
    ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/seam-booking]] (MSC service thread 1-1) Exception sending context initialized event to listener instance of class com.sun.faces.config.ConfigureListener: java.lang.RuntimeException: com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! org.apache.commons.collections.ArrayStack from [Module "deployment.jboss-seam-booking.ear:main" from Service Module Loader]
        (... additional logs removed ...)
    Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections.ArrayStack from [Module "deployment.jboss-seam-booking.ear:main" from Service Module Loader]
    
    Ceci signifie :

    Le ClassNotFoundException indique une dépendance manquante. Dans ce cas, il ne peut pas trouver la classe org.apache.commons.collections.ArrayStack.

    Comment résoudre ceci :

    Trouver le nom de module dans le répertoire EAP6_HOME/modules/system/layers/base/ en cherchant org/apache/commons/collections. Le nom du module est “org.apache.commons.collections”. Modifier le fichier jboss-deployment-structure.xml pour ajouter la dépendance de module à la section de déploiement du fichier.

    <module name="org.apache.commons.collections" export="true"/>
    Le jboss-deployment-structure.xml devrait maintenant ressembler à ceci :
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
      <deployment>
          <dependencies>
            <module name="javax.faces.api" slot="1.2" export="true"/>
                  <module name="com.sun.jsf-impl" slot="1.2" export="true"/>
            <module name="org.apache.commons.logging" export="true"/>
            <module name="org.dom4j" export="true"/>
            <module name="org.apache.commons.collections" export="true"/>
        </dependencies>
      </deployment>
      <sub-deployment name="jboss-seam-booking.war">
        <exclusions>
            <module name="javax.faces.api" slot="main"/>
            <module name="com.sun.jsf-impl" slot="main"/>
          </exclusions>
          <dependencies>
            <module name="javax.faces.api" slot="1.2"/>
                  <module name="com.sun.jsf-impl" slot="1.2"/>
          </dependencies>
      </sub-deployment>
    </jboss-deployment-structure>

    Redéployer l'application en effaçant le fichier EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed et en créant un fichier vide jboss-seam-booking.ear.dodeploy dans le même répertoire.
  7. Problème - Services avec des dépendances manquantes/non disponibles
    Quand vous déployez l'application, le journal contient l'erreur suivante :
    ERROR [org.jboss.as.deployment] (DeploymentScanner-threads - 2) {"Composite operation failed and was rolled back. Steps that failed:" => {"Operation step-2" => {"Services with missing/unavailable dependencies" => ["jboss.deployment.subunit.\"jboss-seam-booking.ear\".\"jboss-seam-booking.jar\".component.AuthenticatorAction.START missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".AuthenticatorAction.\"env/org.jboss.seam.example.booking.AuthenticatorAction/em\" ]","jboss.deployment.subunit.\"jboss-seam-booking.ear\".\"jboss-seam-booking.jar\".component.HotelSearchingAction.START missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".HotelSearchingAction.\"env/org.jboss.seam.example.booking.HotelSearchingAction/em\" ]","
      (... additional logs removed ...)
    "jboss.deployment.subunit.\"jboss-seam-booking.ear\".\"jboss-seam-booking.jar\".component.BookingListAction.START missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".BookingListAction.\"env/org.jboss.seam.example.booking.BookingListAction/em\" ]","jboss.persistenceunit.\"jboss-seam-booking.ear/jboss-seam-booking.jar#bookingDatabase\" missing [ jboss.naming.context.java.bookingDatasource ]"]}}}
    
    Ceci signifie :

    Quand vous avez l'erreur suivante : “Services with missing/unavailable dependencies”, chercher le texte entre les guillemets après “missing”. Dans ce cas, vous verrez :

    missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".AuthenticatorAction.\"env/org.jboss.seam.example.booking.AuthenticatorAction/em\" ]
    
    “/em” indique un problème de Gestionnaire d'entité (Entity Manager) et de source de données.

    Comment résoudre ceci :

    Dans JBoss EAP 6, la configuration de la source de données a été modifiée et doit être définie dans le fichier EAP6_HOME/standalone/configuration/standalone.xml. Comme JBoss EAP 6 est fourni avec une base de données déjà définie dans le fichier standalone.xml, modifier le fichier persistence.xml pour utiliser cet exemple de base de données dans cette application. Si vous regardez dans le fichier standalone.xml, vous verrez que jndi-name de l'exemple de source de données est java:jboss/datasources/ExampleDS. Modifier le fichier jboss-seam-booking.jar/META-INF/persistence.xml pour commenter l'élément jta-data-source et le remplacer comme suit :

    <!-- <jta-data-source>java:/bookingDatasource</jta-data-source> -->
    <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>

    Redéployer l'application en effaçant le fichier EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed et en créant un fichier vide jboss-seam-booking.ear.dodeploy dans le même répertoire.
  8. À ce moment là, l'application se déploie sans erreur, mais quand vous accédez à l'URL http://localhost:8080/seam-booking/ par un navigateur et tentez un "Account Login", vous obtenez l'erreur suivante : “The page isn't redirecting properly”. Dans une prochaine étape, vous allez apprendre comment déboguer et résoudre les erreurs de runtime.
    Pour apprendre comment débogger et comment résoudre les problèmes de runtime, cliquer ici : Section 4.3.7, « Déboguer et résoudre les Erreurs de runtime et les Exceptions de Seam 2.2 Booking Archive »