java - EntityManager 注入(inject)导致 NullPointerException

标签 java jpa jakarta-ee ejb-3.0

我正在编写我的第一个 Java EE(EJB + Servlets 等)应用程序(请注意:我正在使用 Eclipse)。
我遇到了 EntityManager 注入(inject)不起作用的问题,并且由于我的 Java EE(和一般的 Java)菜鸟而难以找到原因。

这是我的 persistence.xml 文件 - 我认为这大部分是正确的,因为我可以从 JMX 控制台启动 HSQL 数据库管理器并且我的 PUBLIC.USER 表正确显示。

<?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="MyPu">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:/DefaultDS</jta-data-source>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
        </properties>
    </persistence-unit>
</persistence>

这是我的 servlet 代码:

[...]
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws      
    String id = request.getParameter("username");
    String password = request.getParameter("password");

    UserManagerBean um = new UserManagerBean();
    um.register(username, password);

    RequestDispatcher dispatcher=getServletContext().getRequestDispatcher("/index.jsp");
    dispatcher.forward(request, response);
}

这是我的 UserManagerBean 类:

//bunch of imports

import myPackage.UserManager;

public @Stateful class UserManagerBean implements UserManager {
    @PersistenceContext(unitName="MyPu")
    private EntityManager persistManager;

    public void register(String username, String password) {
        User user = new User(userame, password);
        persistManager.persist(user);
        persistManager.flush();
    }
}

persistManager.persist(user) 行抛出 NullPointerException。 根据我自己的搜索,我明白这是因为,因为我在 UserManagerBean 上调用 new() ,来自 @PersistenceContext 注释的注入(inject)永远不会发生并且 persistManager 永远不会被绑定(bind)。
如果是这样,很明显我遗漏了一些有关正确使用 EJB 的信息。
实例化我的 bean 的正确方法是什么?接口(interface)是怎么回事?我不完全确定我的 bean 应该是有状态的还是无状态的:\

附加信息:
我更改了我的 servlet 中的代码,从

UserManagerBean um = new UserManagerBean();

@EJB
private UserManagerBean um;

在适当的地方。现在 um 是 NullPointer。

最佳答案

引用 Referencing EJB3 Session Beans from non-EJB3 Beans来自 JBoss 文档:

JBoss Application Server 4.2.2 implemented EJB3 functionality by way of an EJB MBean container running as a plugin in the JBoss Application Server. This had certain implications for application development.

The EJB3 plugin injects references to an EntityManager and @EJB references from one EJB object to another. However this support is limited to the EJB3 MBean and the JAR files it manages. Any JAR files which are loaded from a WAR (such as Servlets, JSF backing beans, and so forth) do not undergo this processing. The Java 5 Enterprise Edition standard specifies that a Servlet can reference a Session Bean through an @EJB annotated reference, this was not implemented in JBoss Application Server 4.2.2.

因此,即使 Java EE 5 规范规定了更广泛的 @EJB 注解范围,但 JBoss 4.2.2 并不支持它。事实上,JBoss 4.2.2 是一个过渡版本,并未声称完全符合 Java EE 5。

因此,要么:

  • 坚持使用 JBoss 的实际版本,但使用 JDNI 查找来获取您的 bean - 或者 -
  • 切换到完全支持整个 Java 5 企业版规范的 JBoss 5 AS(但启动性能很差)- 或 -
  • 切换到另一个 Java EE 5 应用服务器,如 GlassFish v2(甚至 v3)或 WebLogic 10。我会选择 GFv3。

关于java - EntityManager 注入(inject)导致 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2108446/

相关文章:

java - 基于 Java/Groovy 时区的日期时间转换

java - 从字符串中删除特殊字符

java - 没有=newObj()可以实例化new对象吗?

java - Java 客户端到服务器使用原始数据进行通信的可能技术?

javascript - 如何让js文件修改后立即生效?

java - String#equals 抛出 ArrayIndexOutOfBoundException

java : ClassCastException while receiving list of objects using JPA

java - 为什么 Eclipse 不能导出类​​路径中包含的 Maven 库?

java - 使用时间戳的 JPA 查询问题

Java EE 架构 - CDI Beans 属于哪里?