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

EntityManager injection -> NullPointerException
EN

Stack Overflow用户
提问于 2013-07-04 11:12:00
回答 2查看 1.5K关注 0票数 1

我的项目运行在Glassfish 3.0.1上,我正尝试使用@PersistenceContext注解来注入EntityManager。下面是我的代码:

代码语言:javascript
复制
@Stateless
public class UserBean implements UserBeanRemote {

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

    public UserBean() {
        if (this.em == null) {
            System.err.println("NULL");
        }
    }
    ...
}

在控制台中,我得到错误信息"NULL“。我已经看到了5-6个和我相似的话题。但我唯一明白的是,问题可能出在我的persistence.xml上。这就是它:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" 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">

    <persistence-unit name="RHDManagementPlatformPU" transaction-type="JTA">
        <provider>oracle.toplink.essentials.PersistenceProvider</provider>
        <jta-data-source>dev_magi_entities</jta-data-source>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
            <property name="toplink.ddl-generation" value="create-tables"/>
        </properties>
    </persistence-unit>

</persistence>

我试图在互联网上找到如何配置这个文件,但没有找到问题可能在哪里。也许有人有任何想法或教程,手册链接,可以帮助我更好地理解这个野兽是如何工作的=)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-04 14:11:55

资源注入不是在bean创建期间发生的,而是在bean被容器注入时发生的。换句话说,资源是在bean构造函数被调用之后注入的。

您需要在带有@PostConstruct注释的方法中执行测试

代码语言:javascript
复制
@PostConstruct
public void init() {
    if (this.em == null) {
        System.err.println("NULL");
    }
}

正如链接的JavaDoc中所写的:

在依赖项注入完成后需要执行的方法上使用PostConstruct注释

根据下面的评论编辑

如果您碰巧试图通过bean的构造函数来实例化bean,注入将会失败。使用Enterprise Java bean(如JNDI bean)的方法是通过@EJB注释的方式注入它们,或者使用@Stateless查找。请注意,必须将bean注入另一个容器管理的对象(例如JSF bean或CDI bean )。

有关更多参考信息,请参阅this link

票数 4
EN

Stack Overflow用户

发布于 2013-07-04 23:45:10

我最近也遇到了同样的问题。

我们需要创建对jdbc资源的JNDI引用。

下面是我的附加配置。

glassfish-web.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD 
GlassFish Application Server 3.1 Servlet 3.0//EN" 
"http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app>
 <session-config>
  <session-manager />
 </session-config>
 <resource-ref>
  <res-ref-name>java:app/env/mysql</res-ref-name>
  <jndi-name>java:jdbc/mysql</jndi-name>
  <!-- My JDBC Resource -->
 </resource-ref>
 <jsp-config />
</glassfish-web-app>

和我的web.xml:

代码语言:javascript
复制
<data-source>
  <name>java:app/env/mysql</name>
  <class-name>com.mysql.jdbc.jdbc2.optional.MysqlDataSource</class-name>
  <database-name>psi</database-name>
  <user>user</user>
  <password>pass</password>

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

https://stackoverflow.com/questions/17461276

复制
相关文章

相似问题

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