4.3.6. Depuración y resolución de errores y excepciones de implementación del archivador de reservas Seam 2.2

En el paso anterior, Sección 4.3.5, “Construcción e implementación de JBoss EAP versión 5.X de la aplicación de reservas Seam 2.2” construyó la aplicación de reservas Seam 2.2 de JBoss EAP 5.X y la implementó en la carpeta de implementación de JBoss EAP 6. En este paso, depura y resuelve cada cada error de implementación que encuentre.

Importante

Las aplicaciones que usan Hibernate directamente con Seam 2.2 pueden usar una versión de Hibernate 3 empacada dentro de la aplicación. Hibernate 4, el cual se proporciona a través del módulo org.hibernate de JBoss EAP 6 no es soportado por parte de Seam 2.2. Este ejemplo tiene el propósito de ayudarle a empezar a ejecutar su JBoss EAP 6 como primer paso. Tenga en cuenta que el empacar Hibernate 3 con una aplicación Seam 2.2 no es una configuración soportada.

Procedimiento 4.10. Depuración y resolución de excepciones y errores de implementación

  1. Emita - java.lang.ClassNotFoundException: javax.faces.FacesException
    Cuando implementa la aplicación, el registro contiene el siguiente error:
    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)
    
    Lo que significa:

    La ClassNotFoundException indica que falta una dependencia. En este caso, no puede encontrar la clase javax.faces.FacesException y necesita agregar la dependencia de manera explícita.

    Para resolverlo:

    Busque el nombre del módulo para esa clase en el directorio EAP6_HOME/modules/system/layers/base/ buscando una ruta que coincida con la clase que falta. En este caso se encuentran dos módulos que coinciden:

    javax/faces/api/main
    javax/faces/api/1.2
    
    Ambos módulos tienen el mismo nombre de módulo: javax.faces.api pero uno en el directorio principal es para JSF 2.0 y el que se encuentra en el directorio 1.2 es para JSF 1.2. Si hubiera solo un módulo disponibles entonces podría simplemente crear un archivo MANIFEST.MF y agregar la dependencia del módulo. Pero en este caso, quiere utilizar la versión JSF 1.2 y no la versión 2.0 en main así que necesita especificar uno y excluir el otro. Para lograr esto, cree un archivo jboss-deployment-structure.xml en el directorio META-INF/ del EAR que contiene los siguientes datos:
    <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>
    
    En la sección deployment agregue la dependencia para la javax.faces.api para el módulo JSF 1.2. También agregue la dependencia para el módulo JSF 1.2 en la sección de subimplementación para la WAR y excluya el módulo para JSF 2.0.

    Vuelva a implementar la aplicación borrando el archivo EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed y creando un archivo en blanco jboss-seam-booking.ear.dodeploy en el mismo directorio.
  2. Emita - java.lang.ClassNotFoundException: org.apache.commons.logging.Log
    Cuando implementa la aplicación, el registro contiene el siguiente error:
    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]
    
    Lo que significa:

    La ClassNotFoundException indica que falta una dependencia. En este caso, no puede encontrar la clase org.apache.commons.logging.Log y necesita agregar la dependencia de manera explícita.

    Para resolverlo:

    Busque el nombre del módulo para esa clase en el directorio EAP6_HOME/modules/system/layers/base/ buscando una ruta que coincida con la clase que falta. En este caso, encuentra un módulo que coincide con la ruta org/apache/commons/logging/. El nombre del módulo es “org.apache.commons.logging”.

    Modifique el archivo jboss-deployment-structure.xml para agregar la dependencia del módulo a la sección de implementación del archivo.
    <module name="org.apache.commons.logging" export="true"/>
    
    El jboss-deployment-structure.xml ahora se debe ver así:
    <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>
    
    Vuelva a implementar la aplicación borrando el archivo EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed y creando un archivo en blanco jboss-seam-booking.ear.dodeploy en el mismo directorio.
  3. Emita - java.lang.ClassNotFoundException: org.dom4j.DocumentException
    Cuando implementa la aplicación, el registro contiene el siguiente error:
    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]
    
    Lo que significa:

    La ClassNotFoundException indica que falta una dependencia. En este caso, no puede encontrar la clase org.dom4j.DocumentException.

    Para resolverlo:

    Busque el nombre del módulo en el directorio EAP6_HOME/modules/system/layers/base/ buscando la org/dom4j/DocumentException. El nombre del módulo es “org.dom4j”. Modifique el archivo jboss-deployment-structure.xml para agregar la dependencia del módulo a la sección de implementación del archivo.

    <module name="org.dom4j" export="true"/>
    
    El archivo jboss-deployment-structure.xml ahora se debe ver así:
    <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>
    

    Vuelva a implementar la aplicación borrando el archivo EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed y creando un archivo en blanco jboss-seam-booking.ear.dodeploy en el mismo directorio.
  4. Emita - java.lang.ClassNotFoundException: org.hibernate.validator.InvalidValue
    Cuando implementa la aplicación, el registro contiene el siguiente error:
    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]
    
    Lo que significa:

    La ClassNotFoundException indica que falta una dependencia. En este caso, no puede encontrar la clase org.hibernate.validator.InvalidValue.

    Para resolverlo:

    Hay un módulo “org.hibernate.validator”, pero la JAR no contiene la clase org.hibernate.validator.InvalidValue así que el agregar la dependencia del módulo no resuelve este problema. En este caso, la JAR que contiene la clase era parte de la implementación JBoss EAP 5.X. Busque la JAR que contiene la clase que falta en el directorio EAP5_HOME/seam/lib/. Para lograr esto, abra una consola y escriba lo siguiente:

    $ cd EAP5_HOME/seam/lib
    $ grep 'org.hibernate.validator.InvalidValue' `find . -name '*.jar'`
    
    El resultado muestra:
    $ Binary file ./hibernate-validator.jar matches
    $ Binary file ./test/hibernate-all.jar matches
    
    En este caso, copie la hibernate-validator.jar al directorio jboss-seam-booking.ear/lib/:
    $ cp EAP5_HOME/seam/lib/hibernate-validator.jar jboss-seam-booking.ear/lib
    

    Vuelva a implementar la aplicación borrando el archivo EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed y creando un archivo en blanco jboss-seam-booking.ear.dodeploy en el mismo directorio.
  5. Emita - java.lang.InstantiationException: org.jboss.seam.jsf.SeamApplicationFactory
    Cuando implementa la aplicación, el registro contiene el siguiente error:
    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
    
    Lo que significa:

    La com.sun.faces.config.ConfigurationException y la java.lang.InstantiationException indican un problema de dependencias. En este caso, la causa no es tan obvia.

    Para resolverlo:

    Necesita encontrar el módulo que contiene las clases com.sun.faces. Aunque no hay un módulo com.sun.faces, hay dos módulos com.sun.jsf-impl. Una revisión rápida de la jsf-impl-1.2_13.jar en el directorio 1.2 muestra que contiene las clases com.sun.faces. Tal como lo hizo con javax.faces.FacesException ClassNotFoundException, debe utilizar la versión JSF 1.2 y no la versión JSF 2.0 en main, así que necesita especificar una y excluir la otra. Necesita modificar el jboss-deployment-structure.xml para agregar la dependencia del módulo a la sección de implementación del archivo. También tiene que agregarla a la subimplementación WAR y excluir el módulo JSF 2.0. El archivo se debe ver así:

    <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>

    Vuelva a implementar la aplicación borrando el archivo EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed y creando un archivo en blanco jboss-seam-booking.ear.dodeploy en el mismo directorio.
  6. Emita - java.lang.ClassNotFoundException: org.apache.commons.collections.ArrayStack
    Cuando implementa la aplicación, el registro contiene el siguiente error:
    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]
    
    Lo que significa:

    La ClassNotFoundException indica que falta una dependencia. En este caso, no puede encontrar la clase org.apache.commons.collections.ArrayStack.

    Para resolverlo:

    Busque el nombre del módulo en el directorio EAP6_HOME/modules/system/layers/base/ buscando la ruta org/apache/commons/collections. El nombre del módulo es “org.apache.commons.collections”. Modifique el jboss-deployment-structure.xml para agregar la dependencia del módulo a la sección de implementación del archivo.

    <module name="org.apache.commons.collections" export="true"/>
    El archivo jboss-deployment-structure.xml ahora se debe ver así:
    <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>

    Vuelva a implementar la aplicación borrando el archivo EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed y creando un archivo en blanco jboss-seam-booking.ear.dodeploy en el mismo directorio.
  7. Emita - servicios con dependencias no disponibles/que faltan
    Cuando implementa la aplicación, el registro contiene el siguiente error:
    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 ]"]}}}
    
    Lo que significa:

    Cuando obtenga un error “Services with missing/unavailable dependencies”, vea el texto dentro de los paréntesis después de “missing”. En este caso puede ver:

    missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".AuthenticatorAction.\"env/org.jboss.seam.example.booking.AuthenticatorAction/em\" ]
    
    El “/em” indica un problema de fuente de datos y gestor de entidades.

    Para resolverlo:

    En JBoss EAP 6, la configuración de la fuente de datos cambió y es necesario definirla en el archivo EAP6_HOME/standalone/configuration/standalone.xml. Ya que JBoss EAP 6 se envía junto con una base de datos de ejemplo que ya está definida en el archivo standalone.xml, modifique el archivo persistence.xml para utilizar esa base de datos de ejemplo en esta aplicación. Al ver en el archivo standalone.xml puede ver que el jndi-name para la base de datos de ejemplo es java:jboss/datasources/ExampleDS. Modifique el archivo jboss-seam-booking.jar/META-INF/persistence.xml para comentar el elemento existente jta-data-source y reemplazarlo así:

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

    Vuelva a implementar la aplicación borrando el archivo EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed y creando un archivo en blanco jboss-seam-booking.ear.dodeploy en el mismo directorio.
  8. En este momento la aplicación se implementa sin errores, pero cuando accede la URL http://localhost:8080/seam-booking/ en un navegador e intenta "Account Login", obtiene un error en tiempo de ejecución “The page isn't redirecting properly”. En el siguiente paso, aprenderá a depurar y resolver errores en tiempo de ejecución.
    Para aprender cómo depurar y resolver problemas de tiempo de ejecución haga clic aquí: Sección 4.3.7, “Depuración y resolución de errores y excepciones en tiempo de ejecución del archivador de reservas Seam 2.2”