我正在尝试使用@PersistenceContext让容器管理的持久性在几天内没有运气,我已经搜索了每一个相关的问题。
我正在使用:
- IntelliJ14
- 泽西岛2
- JPA 2
- webapp架构3.1
- EJB 3
我已经尝试了很多对我没有用的东西,它只有在我使用事务类型为“Resource_Local”并且自己创建EntityManagerFactory时才有效。 我在这里看了所有类似的问题,请任何帮助将不胜感激! 我收到了这个错误:
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>
答案 0 :(得分:0)
我认为你错过了一个像this answer suggests这样的AbstractBinder实现,但同样的例外。
答案 1 :(得分:0)
我猜你正在构建一个WAR文件并部署到GlassFish或Payara。
无论如何,您需要将<scope>provided</scope>
添加到以下依赖项中:
并完全删除:
这些jar正在用没有能够注入实体管理器或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。