Java PersistenceContext EntityManager注入NullPointerException
我有一场包含以下内容的战争:Java PersistenceContext EntityManager注入NullPointerException,java,hibernate,jpa,jboss,resteasy,Java,Hibernate,Jpa,Jboss,Resteasy,我有一场包含以下内容的战争: META-INF/MANIFEST.MF WEB-INF/classes/META-INF/persistence.xml WEB-INF/classes/com/test/service/TestServlet.class WEB-INF/classes/com/test/service/TestEntity.class WEB-INF/classes/jndi.properties WEB-INF/classes/postgresql-ds.xml WEB-IN
META-INF/MANIFEST.MF
WEB-INF/classes/META-INF/persistence.xml
WEB-INF/classes/com/test/service/TestServlet.class
WEB-INF/classes/com/test/service/TestEntity.class
WEB-INF/classes/jndi.properties
WEB-INF/classes/postgresql-ds.xml
WEB-INF/jboss-web.xml
WEB-INF/web.xml
index.jsp
persistence.xml:
org.hibernate.ejb.HibernatePersistence
java:/TestDS
web.xml:
测试Web应用程序
轻松扫描
真的
org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
放松
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
放松
/服务/*
测试
javax.sql.DataSource
容器
可分享
我的TestServlet类如下所示:
package com.test.service;
import java.util.*;
import javax.persistence.*;
import javax.ws.rs.*;
@Path("/service")
public class TestService {
@PersistenceContext(unitName = "test")
private EntityManager em;
@GET
@Path("/get")
@Produces("application/json")
public List get() {
return em.createQuery("from TestEntity").getResultList();
}
}
当调用get()方法时,我得到一个NullPointerException;EntityManager还没有被注射。对我可能遗漏的内容或如何诊断有何建议?服务器日志中的内容很少
我确信在没有jboss-web.xml或web.xml中的数据源条目的情况下,这项功能可以正常工作。我也将ds.xml单独部署到了deploy目录中,这一点非常明确——我可以在JMX控制台中看到它
尝试使用JBoss 4.2.3和6.0版本,结果相同。实体管理器只能注入事务内部运行的类中。换句话说,它只能注入EJB中。其他类必须使用EntityManager工厂来创建和销毁EntityManager 因为TestService不是EJB,所以注释@PersistenceContext被忽略。不仅如此,在JavaEE5中,不可能在JAX-RS服务中注入EntityManager或EntityManager工厂。您必须使用JavaEE6服务器(JBoss6、GlassFish3等) 以下是注入EntityManagerFactory的示例:
package com.test.service;
import java.util.*;
import javax.persistence.*;
import javax.ws.rs.*;
@Path("/service")
public class TestService {
@PersistenceUnit(unitName = "test")
private EntityManagerFactory entityManagerFactory;
@GET
@Path("/get")
@Produces("application/json")
public List get() {
EntityManager entityManager = entityManagerFactory.createEntityManager();
try {
return entityManager.createQuery("from TestEntity").getResultList();
} finally {
entityManager.close();
}
}
}
最简单的方法是将您的服务声明为EJB3.1,假设您使用的是JavaEE6服务器
相关问题:
如果组件是EJB,那么注入EM应该不会有问题 但是……在JBoss5中,JAX-RS集成不是很好。如果有EJB,则不能使用扫描,必须在上下文参数resteasy.jndi.resource中手动列出。如果仍然启用扫描,Resteasy将扫描资源类并将其注册为普通JAX-RS服务并处理生命周期
这可能就是问题所在 如果实体类中有任何NamedQueries,请检查堆栈跟踪中的编译错误。无法编译的错误查询可能导致无法加载持久性上下文。猜在代码部分发布XML有问题吗?!你必须逃避