2010-03-01 77 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

好的。它必須在方法之外現在我得到一個很好的異常: –