使用带有Wildfly的Jersey上的@PersistenceUnit注入EntityManagerFactory

时间:2016-09-05 15:18:35

标签: java eclipse jersey wildfly

我试图使用@PersistenceUnit注入EntityManagerFactory,但它总是为空。

我认为我的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(不确定是否有必要);

3 个答案:

答案 0 :(得分:3)

泽西岛似乎与Resteasy发生冲突。这样,我有两个选择:

  • 关闭JBoss / Wildfly上的Resteasy(我知道这是可能的,但我不知道如何);
  • 删除泽西并改为使用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注释了我的资源类,我能够正确地注入EntityManager:

@Path("myresource")
@Stateless
public class MyResource {

  @PersistenceContext(unitName="myPersistenceUnit")
  private EntityManager em; 
...

此时,EntityManager还可以,但不知何故,它使用的是JBoss h2 in-memmory数据库(ExampleDS)。 因此,我在JBoss(OracleDS)上配置了一个oracle数据源,并更新了我的persistence.xml以使用OracleDS和JTA而不是&#34; RESOURCE_LOCAL&#34;:

<persistence-unit name="myPersistenceUnit" transaction-type="JTA">
  <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
  <jta-data-source>java:jboss/datasources/OracleDS</jta-data-source>
...

通过这些步骤,我能够注入EntityManager并成功完成我的CRUD操作。

答案 1 :(得分:1)

这里没有@ManagedBean注释,这是一个JSF注释,我根据你的代码试图暴露一个REST层。

只需删除它,一切都会好的(同时确保你的类路径中有一个beans.xml来启用CDI,否则用@Stateless注释你的类

答案 2 :(得分:0)

我认为实体经理应该足够了:

 @PersistenceUnit(unitName= "myPersistenceUnit")
   private EntityManager em;