我正在尝试使用@PersistenceUnit 注入(inject) EntityManagerFactory,但它始终为 null。
我认为我的 persistence.xml 没问题,因为我可以使用以下代码获取 EntityManager:
EntityManager em = Persistence.createEntityManagerFactory("myPersistenceUnit").createEntityManager();
所以,我想知道我是否做错了什么,或者在使用 Jersey (2.23) 和 Wildfly 10 (JBoss EAP 7) 时这是否不可能。
这是我到目前为止所做的:
- 在 eclipse 上创建了一个 jersey-quickstart-webapp maven 项目;
将以下依赖项添加到我的 pom.xml 中:
<dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>7.0</version> </dependency> <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.1-api</artifactId> <version>1.0.0.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>5.2.2.Final</version> </dependency> <dependency> <groupId>com.hynnet</groupId> <artifactId>oracle-driver-ojdbc6</artifactId> <version>12.1.0.1</version> </dependency>
创建了 persistence.xml:
<persistence-unit name="myPersistenceUnit" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <!-- All persistence classes must be listed --> <class>com.mps.classes.TermosPesquisados</class> <properties> <!-- Provider-specific connection properties --> <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver" /> <property name="javax.persistence.jdbc.url" value="JDBC_URL" /> <property name="javax.persistence.jdbc.user" value="USER" /> <property name="javax.persistence.jdbc.password" value="PASSWORD" /> <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" /> <property name="hibernate.show_sql" value="false" /> <property name="hibernate.connection.release_mode" value="after_transaction" /> <property name="hibernate.connection.isolation" value="2" /> </properties> </persistence-unit>
修改了 MyResource.java:
@ManagedBean @Path("myresource") public class MyResource { @PersistenceUnit(unitName= "myPersistenceUnit") private EntityManagerFactory emf; @GET @Produces(MediaType.TEXT_PLAIN) public String getIt() { if(emf == null) return "emf is null"; return "emf is not null"; } }
添加了一个空的 beans.xml(不确定是否有必要);
最佳答案
好像Jersey和Resteasy有冲突。这样,我有 2 个选择:
- 在 JBoss/Wildfly 上关闭 Resteasy(我知道这是可能的,但我不知道怎么做);
- 移除 Jersey 并改用 Resteasy;
我最终选择了第二个选项,因为它更容易,而且我没有理由专门使用 Jersey。
这样,我不得不更改我的 web.xml,替换为:
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
...
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/webapi/*</url-pattern>
</servlet-mapping>
为此:
<servlet-name>javax.ws.rs.core.Application</servlet-name>
...
<servlet-mapping>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<url-pattern>/webapi/*</url-pattern>
</servlet-mapping>
*另一种选择是创建一个扩展 Application 类的类。
*beans.xml 不是必需的。
然后,我用@Stateless 注释了我的资源类,并且我能够正确地注入(inject) EntityManager:
@Path("myresource")
@Stateless
public class MyResource {
@PersistenceContext(unitName="myPersistenceUnit")
private EntityManager em;
...
此时,EntityManager 正常,但不知何故它正在使用 JBoss h2 内存数据库 (ExampleDS)。 因此,我在 JBoss (OracleDS) 上配置了一个 oracle 数据源,并更新了我的 persistence.xml 以使用 OracleDS 和 JTA 而不是“RESOURCE_LOCAL”:
<persistence-unit name="myPersistenceUnit" transaction-type="JTA">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>java:jboss/datasources/OracleDS</jta-data-source>
...
通过这些步骤,我能够注入(inject) EntityManager 并成功进行我的 CRUD 操作。
关于java - 使用 Wildfly 在 Jersey 上使用 @PersistenceUnit 注入(inject) EntityManagerFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39333572/