【问题标题】:TomEE + OpenJPA - can't inject EntityManagerFactory PersistenceUnitTomEE + OpenJPA - 无法注入 EntityManagerFactory PersistenceUnit
【发布时间】:2023-11-04 14:37:02
【问题描述】:

我有一个注入的无状态 EJB

@PersistenceUnit 
private EntityManagerFactory factory

我的persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.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_2_0.xsd">
    <persistence-unit name="ejbPU-ro" transaction-type="RESOURCE_LOCAL">
        <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
        <non-jta-data-source>mySQLDataSource</non-jta-data-source>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
            <property name="openjpa.jdbc.DBDictionary" value="mysql"/>
            <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(foreignKeys=true"/>
            <property name="openjpa.jdbc.SchemaFactory" value="native(foreignKeys=true)"/>
            <property name="openjpa.Log" value="DefaultLevel=INFO,SQL=INFO"/>
        </properties>
    </persistence-unit>
</persistence>

当我使用单元测试时:

Properties p = new Properties();
p.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.core.LocalInitialContextFactory");
p.setProperty(Context.PROVIDER_URL, "http://127.0.0.1:4204/openejb/ejb");
InitialContext initialContext = new InitialContext(p);

还定义了openejb.home VM arg,单元测试运行完美。

在部署到 TomEE 时,我在 my.war/WEB-INF/lib/my.jar/META-INF 中有 persistence.xml。

conf/tomee.xml 我有:

<JndiProvider id="prov" type="javax.naming.InitialContext">
    java.naming.factory.initial = org.apache.openejb.core.LocalInitialContextFactory
    java.naming.provider.url = http://127.0.0.1:4204/openejb/ejb
</JndiProvider>

和:

<Resource id="mySQLDataSource" type="DataSource">
    JdbcDriver          com.mysql.jdbc.Driver
    JdbcUrl             jdbc:mysql://127.0.0.1:3306/mydb
    UserName            root
    Password        
        JtaManaged      false
        DefaultAutoCommit   false
</Resource>

日志看起来不错,但是当我运行代码时,注入的工厂为空。

有什么想法吗?

【问题讨论】:

    标签: openjpa openejb persistence.xml apache-tomee


    【解决方案1】:

    一些东西:

    1) 你的初始上下文:

    p.setProperty(Context.INITIAL_CONTEXT_FACTORY,"org.apache.openejb.core.LocalInitialContextFactory");
    p.setProperty(Context.PROVIDER_URL, "http://127.0.0.1:4204/openejb/ejb"); <- useless since you are in embedded mode
    

    2) 你的 web.xml 有 metadata-complete=true 所以扫描被禁止(删除它)

    3)您通常不需要 org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet(请参阅http://svn.apache.org/repos/asf/tomee/tomee/trunk/examples/rest-example-with-application/) - 或使用 JAXRS 技巧通过 web.xml 声明它(IIRC javax.ws.rs.Application作为初始化参数)

    4) 不确定您的 ajax 网址是否正确(在 tomee@ 上提供的示例中)

    终于得到了一个不为空的电动势(因为它在这里,所以在主干上测试过;)

    【讨论】: