我正在编写我的第一个 Java EE(EJB + Servlet 等)应用程序(请注意:我正在使用 Eclipse)。
我遇到了 EntityManager 注入不起作用的问题,并且由于我的 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();
}
}
The persistManager.persist(user)
行抛出 NullPointerException。
从我自己的搜索中,我了解到发生这种情况是因为,因为我在 UserManagerBean 上调用 new() ,所以从@PersistenceContext
注释永远不会发生,persistManager 也永远不会被绑定。
如果是这样,很明显我遗漏了一些关于正确使用 EJB 的内容。
实例化 bean 的正确方法是什么?接口有什么问题?我不完全确定我的 bean 应该是有状态的还是无状态的:\
附加信息:
我更改了 servlet 中的代码,从
UserManagerBean um = new UserManagerBean();
to
@EJB
private UserManagerBean um;
在适当的地方。现在um
是空指针。