Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java PersistenceContext EntityManager注入NullPointerException_Java_Hibernate_Jpa_Jboss_Resteasy - Fatal编程技术网

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有问题吗?!你必须逃避->,我从来没有在实践中尝试过,所以不要把我牵扯进去,但是在一个声明为Servlet 2.3(J2EE 1.3)而不是Servlet 2.5(Java EE 5,当JPA第一次被引入时)的webapp上运行JPA真的有可能吗?值得一试,无论如何都想这么做,但是更新到2.5声明并没有改变行为。谢谢,类似的问题是,我在这一行上得到了一个NPE:谢谢,这对我有用!我使用的是CXF 2.7.5、Hibernate 4.x、Spring 3.x和JPA 2.x。请告诉我为什么我不能在无状态beans@PersistenceContext(unitName=“Tester2PU”)私有EntityManager em中插入实体管理器;在tomcat 7.0.27中为空。谢谢senthil@user1503117嗨,tomcat不是EJB容器。请尝试使用TomEE、GlassFish或JBoss AS。@Andre:“实体管理器只能在事务内部运行的类中注入”。我认为这不是绝对正确的。您可以插入扩展实体管理器并在非事务性方法中使用它,然后调用事务性方法并加入事务(自动或通过调用EntityManager@joinTransaction()).