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.
- 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.
- 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
- Copié META-INF en 'prueba', que es la carpeta fuente para todas las pruebas, y todo funciona bien
- 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
}