【问题标题】:EntityManager injection -> NullPointerExceptionEntityManager 注入 -> NullPointerException
【发布时间】:2013-07-04 03:11:59
【问题描述】:

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

@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 中。就是这样:

<?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>

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

【问题讨论】:

    标签: jakarta-ee jpa java-ee-6 cdi


    【解决方案1】:

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

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

    @PostConstruct
    public void init() {
        if (this.em == null) {
            System.err.println("NULL");
        }
    }
    

    如链接的 JavaDoc 中所写:

    PostConstruct注解用于依赖注入完成后需要执行的方法


    编辑基于下面的评论。

    如果您有任何机会尝试通过其构造函数自己实例化 bean,则注入将失败。使用 Enterprise Java Bean(如 @Stateless bean)的方法是通过 @EJB 注释注入它们,或者使用 JNDI 查找。请注意,您必须将 bean 注入另一个容器管理的对象(例如 JSF bean 或 CDI bean)。

    请参阅this link 以获取更多参考。

    【讨论】:

    • 我明白了。它可以工作,但我现在看不到注入 EntityManager 的优势,因为我不能在其他功能中使用它。我的课程很少有函数,每个函数都使用 EntityManager。也许整个班级都有某种注释,或者我确实很好地使用了 EntityManager 注入?
    【解决方案2】:

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

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

    这是我的附加配置。

    glassfish-web.xml

    <?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:

    <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>
    

    【讨论】:

    • 对不起,我不知道在JBoss中怎么做
    猜你喜欢
    • 2011-05-07
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    相关资源
    最近更新 更多