EntityManager注入导致NullPointerException

时间:2010-01-21 10:32:44

标签: java jpa java-ee ejb-3.0

我正在编写我的第一个Java EE(EJB + Servlets等)应用程序(请注意:我正在使用Eclipse)。
我遇到了EntityManager注入无法正常工作的问题,并且由于我的Java EE(以及一般的Java)noobness而遇到了一些困难。

这是我的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注释中的注入永远不会发生,并且persistManager永远不会被绑定。
如果是这样,很明显我错过了关于正确使用EJB的一些信息 实例化我的bean的正确方法是什么?接口有什么用?我不完全确定我的豆子应该是有状态的还是无国籍的:\

其他信息:
我在我的servlet中更改了代码,来自

UserManagerBean um = new UserManagerBean();

@EJB
private UserManagerBean um;

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

4 个答案:

答案 0 :(得分:2)

正如Petar Minchev在上面的评论中所说,@ EJB在使用JBoss 4.2的servlet中不起作用。

在WAR(在WEB-INF目录中)中,您需要修改两个文件:

的web.xml:

<ejb-local-ref>
        <ejb-ref-name>ejb/UserManager</ejb-ref-name>
        <ejb-ref-type>Session</ejb-ref-type>
        <local-home/>
        <local>myPackage.UserManager</local>
</ejb-local-ref> 

的JBoss-web.xml中:

<?xml version='1.0' encoding='ISO-8859-1'?>
<!DOCTYPE jboss-web PUBLIC "-//JBoss//DTD Web Application 2.3//EN" "http://www.jboss.org/j2ee/dtd/jboss-web_3_2.dtd">
<jboss-web>

  <ejb-local-ref>
    <ejb-ref-name>ejb/UserManager</ejb-ref-name>
    <local-jndi-name>[earname]/UserManagerBean/local</local-jndi-name>
  </ejb-local-ref>

</jboss-web>

然后,您可以通过执行以下操作获取EJB实例:

UserManagerBean um = (UserManager)new InitialContext().lookup( "java:comp/env/ejb/UserManager" );

答案 1 :(得分:2)

从JBoss文档中引用Referencing EJB3 Session Beans from non-EJB3 Beans

  

JBoss Application Server 4.2.2通过在JBoss Application Server中作为插件运行的EJB MBean容器实现了EJB3功能。这对应用程序开发有一定的影响。

     

EJB3插件将EntityManager和@EJB引用的引用从一个EJB对象注入另一个EJB对象。但是,此支持仅限于EJB3 MBean及其管理的JAR文件。从WAR加载的任何JAR文件(例如Servlet,JSF支持bean等)都不会进行此处理。 Java 5 Enterprise Edition标准规定Servlet可以通过@EJB注释引用引用会话Bean,这在JBoss Application Server 4.2.2中没有实现。

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

因此,要么:

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

答案 2 :(得分:0)

根据评论,事实证明你确实使用了一个根本不支持它的appserver。要解决此问题,您有3个选项:

  1. 使用“旧的”XML配置文件。
  2. 升级服务器(已经有一个稳定的5.1.0)。
  3. 更换服务器(我建议Glassfish v3the most up-to-date)。

答案 3 :(得分:0)

要在项目中启用依赖项注入,请确保您具有文件“beans.xml”并且位置正确。

  • 对于WAR打包,位置为src / main / webapp / WEB-INF /
  • 对于JAR和EAR打包,位置为src / main / resources / META-INF /

如果您有多个maven模块,则必须在每个模块上使用它。

More information about beans.xml