2013-02-11 6 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 VM arg и блок-тест выполняется отлично.

При развертывании в TomEE у меня есть persistence.xml в my.war/WEB-INF/lib/my.jar/META-INF.

в 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 имеет метаданные полной = истина так сканирование тормозится (удалить его)

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 как параметр init)

4) не уверен, что ваш Аякса URL правильно (по предоставленному образцу на tomee @)

, наконец, получил не нулевой эдс (проверен на стволе, так как он был здесь;)