2010-03-01 81 views
1

我是Java EE新手。我试图得到一些第一个例子(JPA)。 我正在使用Glassfish v3。麻烦的是我没有让App服务器注入EntityManager的 。听到的是我用JSP客户端扩展的http://www.adam-bien.com/roller/abien/entry/ejb_3_persistence_jpa_for 的一个示例。Glassfish JPA:注入问题EntityManager

实体:


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

在@Stateless EJB中使用状态的事实不存在问题吗? – cdmckay

回答

10

您得到一个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或托管Bean一个JSF调用你的EJB(和你的EJB可以在这种组件注入)。

如果您需要一些样品,请查看Java EE Code Samples & Apps

更新:看到EJB FAQ How do I access a Local EJB component from a POJO?有关JNDI的详细信息(尤其是新portable global JNDI names defined by the EJB 3.1 specification)。

+0

非常感谢。非常好的解释。我得到: javax.naming.NameNotFoundException:BookServiceBean找不到 ??? –

+0

@Marcel我不完全确定bean可用的JNDI名称。看一下GlassFish控制台,应该在那里记录JDNI名称。 –

+0

它像这样工作: InitialContext()。lookup(“java:module/BookServiceBean”); 再次感谢您。 欢迎来到 –

1

尝试:

@PersistenceContext(unitName = "sample") 
private EntityManager em; 
+1

只要他使用构造函数,这将无济于事。 – whiskeysierra

+0

谢谢。我已经改变了它,它似乎不是问题 –

0

你直接实例化的服务豆,当你真正需要的是具有容器注入它(通过@EJB)。但是,这在JSP中不受支持,因此您也必须切换到servlet。

+0

非常感谢。如果我在servlet中使用@EJB,那么会出现编译错误:注释@EJB不允许用于此位置。MMMMMMMMM Marcel –

+0

请问你可以发一个小例子。对不起,我是新手 –

+0

好的。它必须在方法之外现在我得到一个很好的异常: –