1

我的项目在 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>

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

4

2 回答 2

4

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

您需要使用以下注释的方法执行测试@PostConstruct

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

正如链接的 JavaDoc 中所写:

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


根据下面的评论进行编辑。

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

请参阅此链接以获取更多参考。

于 2013-07-04T06:11:55.483 回答
0

我最近有同样的问题。

我们需要为 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>
于 2013-07-04T15:45:10.150 回答