4.3.6. Depuración y resolución de errores y excepciones de implementación del archivador de reservas Seam 2.2
Importante
Procedimiento 4.10. Depuración y resolución de excepciones y errores de implementación
- Emita - java.lang.ClassNotFoundException: javax.faces.FacesExceptionCuando 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.FacesExceptiony 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.apipero 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 archivoMANIFEST.MFy 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 archivojboss-deployment-structure.xmlen el directorioMETA-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óndeploymentagregue la dependencia para lajavax.faces.apipara 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 archivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failedy creando un archivo en blancojboss-seam-booking.ear.dodeployen el mismo directorio. - Emita - java.lang.ClassNotFoundException: org.apache.commons.logging.LogCuando 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
ClassNotFoundExceptionindica que falta una dependencia. En este caso, no puede encontrar la claseorg.apache.commons.logging.Logy 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 rutaorg/apache/commons/logging/. El nombre del módulo es “org.apache.commons.logging”.Modifique el archivojboss-deployment-structure.xmlpara agregar la dependencia del módulo a la sección de implementación del archivo.<module name="org.apache.commons.logging" export="true"/>
Eljboss-deployment-structure.xmlahora 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 archivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failedy creando un archivo en blancojboss-seam-booking.ear.dodeployen el mismo directorio. - Emita - java.lang.ClassNotFoundException: org.dom4j.DocumentExceptionCuando 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
ClassNotFoundExceptionindica que falta una dependencia. En este caso, no puede encontrar la claseorg.dom4j.DocumentException.Para resolverlo:Busque el nombre del módulo en el directorio
EAP6_HOME/modules/system/layers/base/buscando laorg/dom4j/DocumentException. El nombre del módulo es “org.dom4j”. Modifique el archivojboss-deployment-structure.xmlpara agregar la dependencia del módulo a la sección de implementación del archivo.<module name="org.dom4j" export="true"/>
El archivojboss-deployment-structure.xmlahora 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 archivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failedy creando un archivo en blancojboss-seam-booking.ear.dodeployen el mismo directorio. - Emita - java.lang.ClassNotFoundException: org.hibernate.validator.InvalidValueCuando 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
ClassNotFoundExceptionindica que falta una dependencia. En este caso, no puede encontrar la claseorg.hibernate.validator.InvalidValue.Para resolverlo:Hay un módulo “org.hibernate.validator”, pero la JAR no contiene la clase
org.hibernate.validator.InvalidValueasí 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 directorioEAP5_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 lahibernate-validator.jaral directoriojboss-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 archivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failedy creando un archivo en blancojboss-seam-booking.ear.dodeployen el mismo directorio. - Emita - java.lang.InstantiationException: org.jboss.seam.jsf.SeamApplicationFactoryCuando 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.ConfigurationExceptiony lajava.lang.InstantiationExceptionindican 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ódulocom.sun.faces, hay dos móduloscom.sun.jsf-impl. Una revisión rápida de lajsf-impl-1.2_13.jaren el directorio 1.2 muestra que contiene las clasescom.sun.faces. Tal como lo hizo conjavax.faces.FacesExceptionClassNotFoundException, 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 eljboss-deployment-structure.xmlpara 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 archivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failedy creando un archivo en blancojboss-seam-booking.ear.dodeployen el mismo directorio. - Emita - java.lang.ClassNotFoundException: org.apache.commons.collections.ArrayStackCuando 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
ClassNotFoundExceptionindica que falta una dependencia. En este caso, no puede encontrar la claseorg.apache.commons.collections.ArrayStack.Para resolverlo:Busque el nombre del módulo en el directorio
EAP6_HOME/modules/system/layers/base/buscando la rutaorg/apache/commons/collections. El nombre del módulo es “org.apache.commons.collections”. Modifique eljboss-deployment-structure.xmlpara agregar la dependencia del módulo a la sección de implementación del archivo.<module name="org.apache.commons.collections" export="true"/>
El archivojboss-deployment-structure.xmlahora 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 archivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failedy creando un archivo en blancojboss-seam-booking.ear.dodeployen el mismo directorio. - Emita - servicios con dependencias no disponibles/que faltanCuando 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 archivostandalone.xml, modifique el archivopersistence.xmlpara utilizar esa base de datos de ejemplo en esta aplicación. Al ver en el archivostandalone.xmlpuede ver que eljndi-namepara la base de datos de ejemplo esjava:jboss/datasources/ExampleDS. Modifique el archivojboss-seam-booking.jar/META-INF/persistence.xmlpara comentar el elemento existentejta-data-sourcey 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 archivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failedy creando un archivo en blancojboss-seam-booking.ear.dodeployen el mismo directorio. - 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”Para regresar al tema anterior haga clic aquí: Sección 4.3.4, “Migración del archivador de reservas de Seam 2.2 a JBoss EAP 6: instrucciones paso por paso”