2012-04-17 103 views
6

我在嵌入模式下使用openEjb来测试无状态会话bean,它具有一个注入EntityManager。但是,当我运行测试时,它会失败,因为它无法初始化应用程序。当我看到控制台时,我也可以看到与无法找到persistence.xml有关的错误。openejb嵌入容器找不到persistence.xml

注意:我尝试将WebContent以及META-INF放入类路径中,但这也没有帮助。

更新:

也有一些是关于使用OpenEJB的日食+资源时查找非常奇怪。

  1. 我将WebContent添加到源文件夹。我停止收到persistence.xml错误,但现在我得到一个错误,这表明openejb找不到任何托管资源
  2. 我将WebContent添加到源文件夹,但使用不同的输出文件夹(对输出文件夹使用允许输出文件夹) ,并persistence.xml错误开始再次发生
  3. 我将META-INF复制到'测试',这是所有测试的源文件夹,并且一切运行正常
  4. 关于点1和2,问题似乎事实上,WEB-INF也被包含在WebContent中。如果我排除WEB-INF,那么openejb可以在测试中找到persistence.xml,并且测试运行正常

我对于发生的事情一无所知。

我粘贴下面的所有相关错误和代码。从失败的JUnit测试在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 

我的控制台输出:

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 

无状态会话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> 

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 
} 

回答

7

我收到了同样的异常,问题是两个persistence.xml是在OpenEJB的的classpath中。

当我删除其中一个时,问题就解决了。

异常消息是不是OpenEJB的一部分有用的在这里,但如果你调试到org.apache.openejb.config.AppmodulehasFailures()hasErrors()方法,你可以在EjbModule.getValidation()通话时看到更多有用的信息! (版本4.0.0)。

1

这里的主要问题是,在运行junit时,JUnit开始将WAR文件视为JAR文件,因此试图在META-INF的根目录中查找persistance.xml,而在WAR文件中,META-INF将在内部创建WebContent文件夹。我只是在指向原始META-INF的src文件夹中创建了一个符号链接。和voilla ...............它的工作。 :)

2

Maven的创建,如下图所示对于Web项目的目录结构:

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

要解决您的问题,您应该创建目录[META-INF]目录下[资源]和地点的persistence.xml那里。

相关问题