![](/img/trans.png)
[英]JPA EJB PersistenceContext not injecting EntityManager
[英]Glassfish JPA: Problems injecting EntityManager
我是Java EE的新手。 我试图使一些第一个示例运行(JPA)。 我正在使用Glassfish v3。 问题是我没有让App Server注入EntityManager。 听到的一个例子是http://www.adam-bien.com/roller/abien/entry/ejb_3_persistence_jpa_ ,为此我使用JSP客户端进行了扩展。
实体:
package beans;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Book {
@Id
@GeneratedValue
private Long id;
private String title;
private String subtitle;
public Book() {
}
public Book(String title) {
this.title = title;
}
}
BookService接口:
package beans;
import javax.ejb.Local;
@Local
public interface BookService {
Book createOrUpdate(Book book);
void remove(Book book);
Book find(Object id);
}
BookServiceBean:
package beans;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Stateless
public class BookServiceBean implements BookService {
@PersistenceContext
private EntityManager em;
public Book createOrUpdate(Book book) {
return em.merge(book);
}
public void remove(Book book) {
em.remove(em.merge(book));
}
public Book find(Object id) {
return em.find(Book.class, id);
}
}
persistence.xml:
<persistence>
<persistence-unit name="sample" transaction-type="JTA">
<jta-data-source>jdbc/MarcelsDataSource</jta-data-source>
<properties>
<property name="eclipselink.ddl-generation" value="create-tables"/>
</properties>
</persistence-unit>
</persistence>
index.jsp:
<%@ page import="beans.BookServiceBean" %>
<%@ page import="beans.Book" %>
<html>
<body>
<%
BookServiceBean bs = new BookServiceBean();
Book b = new Book("Superman");
bs.createOrUpdate(b);
%>
</body>
</html>
如果运行示例,则会在createOrUpdate()方法中收到java.lang.NullPointerException,因此显然不会正确注入entityManager。 我试图寻找一种补救方法已经有好几天了,我们将不胜感激。
谢谢
马塞尔
之所以会得到NullPointerException
是因为您正在使用new()
实例化BookService
,这基本上是错误的,并且没有任何东西注入到EJB中。 EJB是由容器管理的组件,应该通过注入或查找来获取。
在这里,尽管JSP规范允许在代码片段中运行任何代码,但实际上并不鼓励从JSP调用EJB,并且JSP不支持注入。 换句话说,您将必须使用查找:
<%@ page import="beans.BookService" %>
<%@ page import="beans.Book" %>
<html>
<body>
<%
BookService bs = (BookService) new InitialContext().lookup("java:module/BookServiceBean")
Book b = new Book("Superman");
bs.createOrUpdate(b);
%>
</body>
</html>
但是您应该从Servlet或JSF Managed Bean调用EJB(并且EJB可以注入到此类组件中)。
如果需要一些示例,请查看Java EE代码示例和应用程序 。
更新:请参阅如何从POJO访问本地EJB组件? EJB FAQ中的有关JNDI(尤其是EJB 3.1规范定义的新的可移植全局JNDI名称)的更多详细信息。
尝试:
@PersistenceContext(unitName = "sample")
private EntityManager em;
当您确实需要容器(通过@EJB)注入它时,您将直接实例化服务bean。 但是,JSP不支持此功能,因此您也必须切换到servlet。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.