java - openejb 嵌入式容器找不到 persistence.xml

标签 java unit-testing jakarta-ee ejb openejb

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

注意:我尝试将 WebContent 和 META-INF 放在类路径中,但这也无济于事。

更新:

在使用 openejb + eclipse 时,资源查找有一些非常奇怪的地方。

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

老实说,我对正在发生的事情一无所知。

我在下面粘贴了所有相关的错误和代码。

Eclipse 中 JUnit 测试失败的错误堆栈

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

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

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
}

最佳答案

我收到了同样的异常,问题是两个 persistence.xml 在 OpenEJB 的类路径上。

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

异常消息在这里对 OpenEJB 的一部分没有帮助,但如果您调试到 org.apache.openejb.config.AppmodulehasFailures()hasErrors() 方法,您可以在 EjbModule.getValidation() 调用中看到更多有用的信息! (版本 4.0.0)。

关于java - openejb 嵌入式容器找不到 persistence.xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10188006/

相关文章:

java - 获取 javax.mail.NoSuchProviderException : imap when trying to poll a mail server

java - 如何根据 Camel Exchange 的起源地进行不同的处理?

c# - 并行命名空间冲突

python - 用于 Python 单元测试的单例析构函数

java - 使用 WebSockets 实现 WebRTC 信令

java - 淡出 JButton 直到选择 JCheckbox

python - django 测试文件下载 - "ValueError: I/O operation on closed file"

java - Java EE 应用程序无法识别 Google Visualization API

java - 为什么我无法让注入(inject)发挥作用?

java - 如何使自动完成预测可点击?