首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PersistenceContext EntityManager injection NullPointerException

PersistenceContext EntityManager injection NullPointerException
EN

Stack Overflow用户
提问于 2011-01-17 05:05:26
回答 3查看 149.4K关注 0票数 45

我有一场包含以下内容的战争:

代码语言:javascript
复制
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:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/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_1_0.xsd" version="1.0">
    <persistence-unit name="test">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:/TestDS</jta-data-source>

        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="hibernate.show_sql" value="true" />
        </properties>
    </persistence-unit>
</persistence>

web.xml:

代码语言:javascript
复制
<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Test Web Application</display-name>

    <context-param>
        <param-name>resteasy.scan</param-name>
        <param-value>true</param-value>
    </context-param>
    <listener>
        <listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
    </listener>
    <servlet>
        <servlet-name>Resteasy</servlet-name>
        <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Resteasy</servlet-name>
        <url-pattern>/service/*</url-pattern>
    </servlet-mapping>

    <resource-ref>
        <res-ref-name>TestDS</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
        <res-sharing-scope>Shareable</res-sharing-scope>
    </resource-ref>
</web-app>

我的TestServlet类如下所示:

代码语言:javascript
复制
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版本,结果相同。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-18 03:51:04

实体管理器只能注入在事务内部运行的类中。换句话说,它只能被注入到EJB中。其他类必须使用EntityManagerFactory来创建和销毁EntityManager。

由于您的TestService不是EJB,因此注释@PersistenceContext将被忽略。不仅如此,在JAX5中,不可能在JavaEE -RS服务中注入EntityManager或EntityManagerFactory。你必须使用JavaEE 6服务器(JBoss 6、Glassfish 3等)。

下面是一个注入EntityManagerFactory的示例:

代码语言:javascript
复制
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,假设您使用的是JavaEE 6服务器。

相关问题:Inject an EJB into JAX-RS (RESTful service)

票数 81
EN

Stack Overflow用户

发布于 2012-03-05 21:29:29

如果组件是EJB,那么应该不会有注入EM的问题。

But....In JBoss 5,JAX-RS集成不是很好。如果您有一个EJB,则不能使用扫描,必须在上下文参数resteasy.jndi.resource中手动列出。如果仍然启用扫描,Resteasy将扫描资源类,并将其注册为普通JAX-RS服务并处理生命周期。

这可能就是问题所在。

票数 2
EN

Stack Overflow用户

发布于 2021-02-27 07:37:57

如果您的实体类中有任何NamedQueries,请检查堆栈跟踪以查找编译错误。无法编译的格式错误的查询可能导致无法加载持久性上下文。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4708035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档