Question

Je suis nouveau à Java EE. J'ai essayé d'obtenir des premiers exemples en cours d'exécution (JPA). J'utilise Glassfish v3. Le problème est que je ne reçois pas le serveur App injection le EntityManager. Entendre est un exemple http://www.adam-bien.com/roller/ abien / entrée / ejb_3_persistence_jpa_for   que j'étendu avec un client JSP.

Entité:


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


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>

Si je lance l'exemple je reçois un java.lang.NullPointerException dans la méthode createOrUpdate () de sorte que le entityManager est évidemment pas injecté correctement. J'ai essayé de trouver un remède pour les jours maintenant et un peu d'aide serait très appréciée.

Merci

Marcel

Était-ce utile?

La solution

Vous obtenez un NullPointerException parce que vous instanciation votre BookService avec un new() - qui est fondamentalement faux - et rien ne s'injecté dans l'EJB. EJB sont composant qui sont gérés par le conteneur et doit être obtenue soit par injection ou avec une recherche.

Ici, alors que la spécification JSP permet à tout code à exécuter dans un scriplet, appeler un EJB à partir d'un JSP est en fait pas vraiment encouragé et JSPs ne supportent pas l'injection. En d'autres termes, vous devez utiliser une recherche:

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

Mais vous devriez appeler votre EJB à partir d'un Servlet ou un JSF Managed Bean (et votre EJB peut être injecté dans ces composants).

Si vous avez besoin d'échantillons, jetez un oeil à la code Java EE échantillons & Apps .

Mise à jour: Voir Comment puis-je accéder un composant EJB local à partir d'un POJO dans la FAQ EJB pour plus de détails sur JNDI (en particulier le nouveau noms JNDI globaux portables définis par la spécification EJB 3.1).

Autres conseils

Essayez:

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

Vous instanciation directement la fève de service, lorsque vous avez vraiment besoin d'être avec le récipient injectent (via @EJB). Ce ne sont pas pris en charge dans une JSP, cependant, de sorte que vous devrez passer à un servlet ainsi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top