我正在编写我的第一个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。
答案 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标准。
因此,要么:
答案 2 :(得分:0)
根据评论,事实证明你确实使用了一个根本不支持它的appserver。要解决此问题,您有3个选项:
答案 3 :(得分:0)
要在项目中启用依赖项注入,请确保您具有文件“beans.xml”并且位置正确。
如果您有多个maven模块,则必须在每个模块上使用它。