我是Java EE的新手。我试着运行一些第一个例子(JPA)。 我正在使用Glassfish v3。麻烦的是我没有得到App Server注入 EntityManager。听到是一个例子http://www.adam-bien.com/roller/abien/entry/ejb_3_persistence_jpa_for 我用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是 显然没有正确注射。我试着找几天补救措施了 一些帮助将受到高度赞赏。
由于
马塞尔
答案 0 :(得分:10)
你得到一个NullPointerException
,因为你用BookService
实例化你的new()
- 这基本上是错误的 - 并且没有任何东西被注入到EJB中。 EJB是由容器管理的组件,应该通过注入或查找来获取。
虽然JSP规范允许任何代码在scriplet中运行,但实际上并不鼓励从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 Code Samples & Apps。
更新:有关JNDI的更多详细信息,请参阅EJB常见问题解答中的How do I access a Local EJB component from a POJO?。(特别是新的portable global JNDI names defined by the EJB 3.1 specification)。
答案 1 :(得分:1)
尝试:
@PersistenceContext(unitName = "sample")
private EntityManager em;
答案 2 :(得分:0)
当你真的需要让容器注入它时(通过@EJB),你直接实例化服务bean。但是,JSP不支持这种方式,因此您也必须切换到servlet。