2013-02-11 31 views
1

我有一个无状态EJB是注入TomEE + OpenJPA的 - 不能注入的EntityManagerFactory PersistenceUnit

@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虚拟机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> 

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

任何想法?

回答

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具有元数据的完整= true,以便扫描被抑制(删除它)

3)您通常不需要org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet(请参阅​​) - 或使用JAXRS技巧通过web.xml声明它(IIRC javax.ws.rs.Application作为初始参数)

4)不知道你的AJAX的网址是正确的(关于tomee @所提供的样品)

终于得到了一个不空EMF(主干,因为它是在这里测试;)

相关问题