Frage

Ich bin zu Java EE neu. Ich habe versucht, einige erste Beispiele laufen (JPA) zu erhalten. Ich bin mit Glassfish v3. Das Problem ist, dass ich nicht den App Server injizierende erhalte die EntityManager. Hear ist ein Beispiel http://www.adam-bien.com/roller/ abien / entry / ejb_3_persistence_jpa_for   die ich mit einem JSP-Client erweitert.

Entity:


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-Schnittstelle:


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>

Wenn ich das Beispiel laufen bekomme ich eine java.lang.NullPointerException im createOrUpdate () -Methode so die EntityManager ist offensichtlich nicht richtig eingespritzt. Ich habe versucht, ein Heilmittel für Tage jetzt zu finden und etwas Hilfe sehr geschätzt würde.

Danke

Marcel

War es hilfreich?

Lösung

Sie eine NullPointerException erhalten, weil Sie Ihre BookService mit einem new() sind Instanziieren - das ist im Grunde falsch ist - und nichts wird in der EJB injiziert. EJB ist Komponente, die vom Container verwaltet werden, und soll über eine Injektion oder mit einem Nachschlag erhalten entweder werden.

Hier, während die JSP-Spezifikation jeder Code ermöglicht in einem scriplet ausgeführt werden sollte, wird ein EJB von einem JSP Aufruf eigentlich nicht wirklich ermutigt und JSPs nicht unterstützen Injektion. Mit anderen Worten, werden Sie eine Lookup verwenden müssen:

<%@ 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>

Aber Sie sollten Ihre EJB von einem Servlet oder einer JSF Managed Bean aufrufen (und Ihre EJB in solchen Komponenten injiziert werden könnte).

Wenn Sie einige Proben benötigen, hat einen Blick auf den Java EE Code-Beispielen und Anwendungen .

Update: finden Sie unter Wie kann ich Zugang eine lokale EJB-Komponente von einem POJO? in dem EJB-FAQ für weitere Details über JNDI (vor allem die neuen portable globaler JNDI-Name durch die EJB 3.1-Spezifikation definiert).

Andere Tipps

Versuchen Sie:

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

Sie sind Instanziieren des Service-Bean direkt, wenn Sie wirklich den Behälter spritzen es mit sein müssen (via @ EJB). Dies ist nicht in einer JSP unterstützt, obwohl, so dass Sie auf ein Servlet als auch wechseln werden müssen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top