繁体   English   中英

JPA EJB Jersey @PersistenceContext未实例化EntityManager

[英]JPA EJB Jersey @PersistenceContext is not instantiating EntityManager

我现在尝试使用@PersistenceContext来进行容器管理的持久性几天没有任何麻烦,我已经搜索了每个相关的问题。 我在用:
-IntelliJ14
-球衣2
-JPA 2
-webapp模式3.1
-EJB 3

我已经尝试了很多对我没有用的东西,但是只有当我使用自己创建EntityManagerFactory的事务类型为“ Resource_Local”时,它才起作用。 我在这里查看了所有类似的问题,请提供任何帮助! 我收到此错误:

Caused by: org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=PersistenceManager,parent=UserController,qualifiers={},position=-1,optional=false,self=false,unqualified=null,454129121)
    at org.jvnet.hk2.internal.ThreeThirtyResolver.resolve(ThreeThirtyResolver.java:74) [hk2-locator-2.4.0-b25.jar:]
    at org.jvnet.hk2.internal.ClazzCreator.resolve(ClazzCreator.java:214) [hk2-locator-2.4.0-b25.jar:]
    at org.jvnet.hk2.internal.ClazzCreator.resolveAllDependencies(ClazzCreator.java:237) [hk2-locator-2.4.0-b25.jar:]
    ... 56 more

这是我当前的代码:
web.xml中

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

  <display-name>Rest</display-name>

    <servlet>
        <servlet-name>jersey-serlvet</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>com.mudhar.rest.controller</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>jersey-serlvet</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

</web-app>

persistence.xml中

<?xml version="1.0" encoding="UTF-8" ?>
<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"
             version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
    <persistence-unit name="mudhar" transaction-type="JTA">
        <class>com.mudhar.rest.model.User</class>
        <properties>
            <property name="hibernate.enable_lazy_load_no_trans" value="true" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/mudhardb" />
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password" value="root" />
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
        </properties>
    </persistence-unit>
</persistence>

服务资源:

package com.mudhar.rest.controller;

import com.mudhar.rest.dao.PersistenceManager;
import com.mudhar.rest.model.RequestBody;
import com.mudhar.rest.model.User;

import javax.ejb.EJB;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import java.sql.Timestamp;

@Path("/user")
public class UserController {

    @Inject
    PersistenceManager persistenceManager;

    @POST
    @Path("/get")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public User getUser(RequestBody body) {

        String idUser = body.getIdUser();

        EntityManager em = persistenceManager.getEntityManager();
        em.getTransaction().begin();

        User user = em.find(User.class, Long.valueOf(idUser));

        em.getTransaction().commit();
        em.close();
        return user;
    }

    @PUT
    @Path("/add")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public String addUser(User user){

        System.out.println(user.toString());
        String result = "Success";
        EntityManager em = persistenceManager.getEntityManager();
        em.getTransaction().begin();
        Timestamp timestamp = new Timestamp(System.currentTimeMillis());
        user.setTimestamp(timestamp);
        try {
            em.merge(user);
            em.getTransaction().commit();
        }catch (Exception e){
            e.printStackTrace();
            result = "Failed";
        }

        em.close();
        return result;

    }

}

PersistenceManager.java

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.Persistence;
import javax.persistence.PersistenceContext;

@Stateless
public class PersistenceManager {

    @PersistenceContext(unitName = "mudhar")
    private EntityManager em;


    public EntityManager getEntityManager() {
        return em;
    }
    public void close() {
        em.close();
    }
}

的pom.xml

<properties>
    <jersey2.version>2.19</jersey2.version>
    <jaxrs.version>2.0.1</jaxrs.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

    <!-- JAX-RS -->
    <dependency>
      <groupId>javax.ws.rs</groupId>
      <artifactId>javax.ws.rs-api</artifactId>
      <version>${jaxrs.version}</version>
    </dependency>
    <!-- Jersey 2.19 -->
    <dependency>
      <groupId>org.glassfish.jersey.containers</groupId>
      <artifactId>jersey-container-servlet</artifactId>
      <version>${jersey2.version}</version>
    </dependency>
    <dependency>
      <groupId>org.glassfish.jersey.core</groupId>
      <artifactId>jersey-server</artifactId>
      <version>${jersey2.version}</version>
    </dependency>


    <!-- https://mvnrepository.com/artifact/org.hibernate.javax.persistence/hibernate-jpa-2.1-api -->
    <dependency>
      <groupId>org.hibernate.javax.persistence</groupId>
      <artifactId>hibernate-jpa-2.1-api</artifactId>
      <version>1.0.0.Final</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-json-jackson -->
    <dependency>
      <groupId>org.glassfish.jersey.media</groupId>
      <artifactId>jersey-media-json-jackson</artifactId>
      <version>2.19</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.6</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/javax.ejb/ejb-api -->
    <dependency>
      <groupId>javax.ejb</groupId>
      <artifactId>ejb-api</artifactId>
      <version>3.0</version>
      <scope>provided</scope>
    </dependency>


  </dependencies>
  <build>
    <finalName>DealderRest</finalName>
  </build>
</project>

我认为您缺少像这样的答案所建议的AbstractBinder实现,适用于同一异常。

我猜您正在构建WAR文件并部署到GlassFish或Payara。

无论如何,您需要将<scope>provided</scope>到以下依赖项:

  • javax.ws.rs-API
  • 冬眠,JPA-2.1-API

并完全删除:

  • 新泽西州容器的servlet
  • 球衣服务器
  • 新泽西媒体JSON - 杰克逊

这些罐子用没有实现注入实体管理器或EJB所需的集成的代码替换了服务器实现。

完全删除web.xml文件,因为它是多余的。

最后,我建议您暂时忘记您的PersistenceManager类,并按如下所示更改UserController

@Stateless
@Path("/user")
public class UserController {

    @PersistenceContext(unitName = "mudhar")
    private EntityManager em;

    @POST
    @Path("/get")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public User getUser(RequestBody body) {

        String idUser = body.getIdUser();    
        User user = em.find(User.class, Long.valueOf(idUser));    
        return user;
    }

    @PUT
    @Path("/add")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public String addUser(User user){

        System.out.println(user.toString());
        String result = "Success";
        Timestamp timestamp = new Timestamp(System.currentTimeMillis());
        user.setTimestamp(timestamp);
        user = em.merge(user);
        return result;

    }

}

您可以看到这要简单得多。 请注意,它已被注释为@Stateless因此它现在是EJB,因此您只需一行代码即可获得事务管理和其他功能。

请注意,如果您使用的是GlassFish / Payara,则JPA实现将是EclipseLink而不是Hibernate。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM