2012-04-17 15 views
6

Estoy usando openEjb en modo incrustado para probar un bean de sesión sin estado, que tiene un EntityManager inyectado. Sin embargo, cuando ejecuto la prueba, falla porque no pudo inicializar la aplicación. Cuando veo la consola también puedo ver un error relacionado con la imposibilidad de encontrar persistence.xmlcontenedor integrado openejb no puede encontrar persistence.xml

Nota: Intenté poner WebContent, así como META-INF en el classpath, pero eso tampoco ayuda.

Actualización:

Hay algo muy extraño en las búsquedas de recursos cuando se utiliza openejb + eclipse.

  1. Agregué WebContent a las carpetas de origen. Dejé de obtener el error persistence.xml, pero ahora recibo un error que sugiere que openejb no pudo encontrar ningún recurso administrado.
  2. Agregué WebContent a las carpetas de origen, pero con una carpeta de salida diferente (usando permitir carpetas de salida para las carpetas de origen) , y el error persistence.xml comienza a ocurrir nuevamente
  3. Copié META-INF en 'prueba', que es la carpeta fuente para todas las pruebas, y todo funciona bien
  4. En cuanto a los puntos 1 y 2, parece que el problema sea ​​el hecho de que WEB-INF también se incluye como parte de WebContent. Si excluyo WEB-INF, entonces nuevamente openejb puede encontrar persistence.xml en la prueba y la prueba funciona bien

Honestamente no tengo ni idea de lo que está sucediendo.

Estoy pegando todos los errores relevantes y código a continuación.

pila de errores de fallar la prueba JUnit en Eclipse

org.apache.openejb.OpenEjbContainer$InvalidApplicationException: org.apache.openejb.config.ValidationFailedException: Module failed validation. AppModule(name=) 
    at org.apache.openejb.OpenEjbContainer$Provider.createEJBContainer(OpenEjbContainer.java:273) 
    at javax.ejb.embeddable.EJBContainer.createEJBContainer(EJBContainer.java:56) 
    at javax.ejb.embeddable.EJBContainer.createEJBContainer(EJBContainer.java:43) 
    at com.diycomputerscience.slides.service.SlideServiceTest.setUp(SlideServiceTest.java:45) 
    at junit.framework.TestCase.runBare(TestCase.java:128) 
    at junit.framework.TestResult$1.protect(TestResult.java:106) 
    at junit.framework.TestResult.runProtected(TestResult.java:124) 
    at junit.framework.TestResult.run(TestResult.java:109) 
    at junit.framework.TestCase.run(TestCase.java:120) 
    at junit.framework.TestSuite.runTest(TestSuite.java:230) 
    at junit.framework.TestSuite.run(TestSuite.java:225) 
    at junit.framework.TestSuite.runTest(TestSuite.java:230) 
    at junit.framework.TestSuite.run(TestSuite.java:225) 
    at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
Caused by: org.apache.openejb.config.ValidationFailedException: Module failed validation. AppModule(name=) 
    at org.apache.openejb.config.ReportValidationResults.deploy(ReportValidationResults.java:82) 
    at org.apache.openejb.config.AppInfoBuilder.build(AppInfoBuilder.java:264) 
    at org.apache.openejb.config.ConfigurationFactory.configureApplication(ConfigurationFactory.java:696) 
    at org.apache.openejb.OpenEjbContainer$Provider.createEJBContainer(OpenEjbContainer.java:267) 
    ... 18 more 

Mi salida de la consola:

Apache OpenEJB 4.0.0-beta-2 build: 20120115-08:26 
http://openejb.apache.org/ 
INFO - openejb.home = /home/user/workspace/wwald/slides 
INFO - openejb.base = /home/user/workspace/wwald/slides 
INFO - Using 'javax.ejb.embeddable.EJBContainer=true' 
INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service) 
INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager) 
INFO - Inspecting classpath for applications: 38 urls. Consider adjusting your exclude/include. Current settings: openejb.deployments.classpath.exclude='', openejb.deployments.classpath.include='.*' 
INFO - Found EjbModule in classpath: /home/user/workspace/wwald/slides/build/classes 
INFO - Searched 38 classpath urls in 2000 milliseconds. Average 52 milliseconds per url. 
INFO - Beginning load: /home/user/workspace/wwald/slides/build/classes 
INFO - Configuring enterprise application: /home/user/workspace/wwald/slides 
INFO - Configuring Service(id=Default Stateless Container, type=Container, provider-id=Default Stateless Container) 
INFO - Auto-creating a container for bean SlideService: Container(type=STATELESS, id=Default Stateless Container) 
INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container) 
INFO - Auto-creating a container for bean com.diycomputerscience.slides.service.SlideServiceTest: Container(type=MANAGED, id=Default Managed Container) 
INFO - Dumping Generated ejb-jar.xml to: /tmp/ejb-jar-5804778531295096416slides.xml 
INFO - Dumping Generated openejb-jar.xml to: /tmp/openejb-jar-2921830618491817127slides.xml 
ERROR - FAIL ... SlideService: Missing required persistence.xml for @PersistenceContext ref "em" to unit "entities" 
ERROR - Invalid EjbModule(name=slides, path=/home/user/workspace/wwald/slides/build/classes) 
INFO - Set the 'openejb.validation.output.level' system property to VERBOSE for increased validation details. 
WARN - configureApplication.loadFailed 

El Stateless Session Bean:

@Stateless 
public class SlideService { 
    @PersistenceContext(unitName="entities", type=PersistenceContextType.TRANSACTION) 
    private EntityManager em; 

    //various business methods not shown for brevity 
} 

persistence.xml

<persistence version="1.0" 
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> 
    <persistence-unit name="entities"> 
     <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> 
     <jta-data-source>myds</jta-data-source> 
     <non-jta-data-source>myds</non-jta-data-source> 
     <properties> 
      <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

El test JUnit:

public class SlideServiceTest extends TestCase { 

    private SlideService slideService; 

    public SlideServiceTest(String name) { 
     super(name); 
    } 

    protected void setUp() throws Exception { 
     super.setUp(); 

     final Properties p = new Properties(); 
     p.put("myds", "new://Resource?type=DataSource"); 
     p.put("myds.JdbcDriver", "org.hsqldb.jdbcDriver"); 
     p.put("myds.JdbcUrl", "jdbc:hsqldb:mem:slidedb"); 

     EJBContainer ejbContainer = EJBContainer.createEJBContainer(); 
     Object oSlideService = ejbContainer.getContext().lookup("java:global/slides/SlideService"); 
     assertNotNull(oSlideService); 
     this.slideService = (SlideService)oSlideService; 
    } 

    //not showing test methods for brevity, since the code fails in setUp itself 
} 

Respuesta

7

que recibieron la misma excepción y el problema fue que dos persistence.xml estaban en la ruta de clase de OpenEJB.

Cuando eliminé uno de ellos, se solucionó el problema.

El mensaje de excepción no es útil aquí en la parte de OpenEJB, pero si se depura en el método org.apache.openejb.config.Appmodule 's hasFailures() o hasErrors(), se puede ver información más útil en EjbModule.getValidation() llamadas! (Versión 4.0.0).

1

El problema principal aquí es que mientras se ejecuta junit, JUnit comienza a pensar que el archivo WAR como archivo JAR trata de encontrar el persistance.xml en META-INF en la raíz, mientras que en el archivo WAR se crea el META-INF Carpeta WebContent. Simplemente creé un enlace simbólico en la carpeta src apuntando al META-INF original. Y voilla ............... funcionó. :)

2

Maven crea la estructura de directorios para proyectos web como se muestra a continuación:

src->main-+->java 
      +->resources->META-INF 
      +->webapp->WEB-INF 

Para resolver el problema se debe crear dir [META-INF] bajo el directorio [recursos] y colocar persistence.xml allí.

Cuestiones relacionadas