在带有Wildfly的Jersey上使用@PersistenceUnit注入EntityManagerFactory [英] Inject EntityManagerFactory using @PersistenceUnit on Jersey with Wildfly

查看:123
本文介绍了在带有Wildfly的Jersey上使用@PersistenceUnit注入EntityManagerFactory的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用@PersistenceUnit注入EntityManagerFactory,但它始终为null.

I'm trying to inject EntityManagerFactory using @PersistenceUnit, but it's always null.

我认为我的persistence.xml可以,因为我可以使用以下代码获取EntityManager:

I think my persistence.xml is OK, since I can get the EntityManager with this code:

EntityManager em = Persistence.createEntityManagerFactory("myPersistenceUnit").createEntityManager();

因此,我想知道我是否做错了什么,或者在使用Jersey(2.23)和Wildfly 10(JBoss EAP 7)时是否无法做到这一点.

So, I would like to know if I'm doing something wrong, or if this is not possible when using Jersey (2.23) and Wildfly 10 (JBoss EAP 7).

这是我到目前为止所做的:

Here is what I've done so far:

  • 在eclipse上创建了Jersey-quickstart-webapp maven项目;
  • 向我的pom.xml添加了以下依赖项:

  • Created a jersey-quickstart-webapp maven project on eclipse;
  • Added the following dependencies to my 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:

  • Created the 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:

  • Modified the 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(不确定是否有必要);

  • Added an empty beans.xml (not sure if it's necessary);

    推荐答案

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

    It seems that Jersey conflicts with Resteasy. This way, I had 2 options:

    • 在JBoss/Wildfly上关闭Resteasy(我知道这是可能的,但是我不知道如何);
    • 删除球衣并改用Resteasy;

    我最终选择了第二个选项,因为它比较容易,而且我没有理由专门使用球衣.

    I ended up choosing the 2nd option because it was easier and I have no reasons to use specifically Jersey.

    这样,我不得不更改我的web.xml,替换为:

    This way, I had to change my web.xml, replacing this:

    <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类的类.

    *Another option was to create a class extending Application class.

    * beans.xml不是必需的.

    *beans.xml was not necessary.

    然后,我用@Stateless注释了资源类,并且能够正确注入EntityManager:

    Then, I annotated my resource class with @Stateless and I was able to inject EntityManager properly:

    @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":

    At this point, EntityManager was OK, but somehow it was using JBoss h2 in-memmory database (ExampleDS). So, I configured an oracle datasource on JBoss (OracleDS) and updated my persistence.xml to use OracleDS and JTA instead of "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>
    ...
    

    通过这些步骤,我能够注入EntityManager并成功进行CRUD操作.

    With those steps I was able to inject EntityManager and make my CRUD operations successfully.

    这篇关于在带有Wildfly的Jersey上使用@PersistenceUnit注入EntityManagerFactory的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

  • 查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆