簡體   English   中英

Glassfish JPA:注入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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM