Glassfish JPA: des Problèmes de l'injection de l'EntityManager
Je suis nouveau sur Java EE. J'ai essayé d'obtenir quelques premiers exemples en cours d'exécution (JPA).
Je suis à l'aide de Glassfish v3. Le problème est que je n'ai pas l'Application Serveur d'injection
l'EntityManager. Entendre est un exemple http://www.adam-bien.com/roller/abien/entry/ejb_3_persistence_jpa_for
qui j'ai étendu avec une JSP client.
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 exécuter l'exemple, je reçois un java.lang.NullPointerException dans le createOrUpdate() méthode 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.
Grâce
Marcel
- N'est-il pas aussi un problème avec le fait qu'il l'aide de l'état dans un @EJB Stateless?
Vous devez vous connecter pour publier un commentaire.
Vous obtenez un
NullPointerException
parce que vous êtes l'instanciation de votreBookService
avec unnew()
- qui est fondamentalement erroné - et rien n'est injecté dans l'EJB. Les EJB sont des composants qui sont gérés par le conteneur et devrait être obtenu soit par injection ou avec une recherche.Ici, alors que le JSP spec permet à n'importe quel code à exécuter dans un scriplet, l'appel d'un EJB à partir d'une JSP est en fait pas vraiment encouragé et les Jsp ne prennent pas en charge l'injection. En d'autres termes, vous devrez utiliser une recherche:
Mais vous devriez appeler votre EJB à partir d'une Servlet ou un Managed Bean JSF (et votre EJB peut être injecté dans de tels composants).
Si vous avez besoin de quelques échantillons, ont un coup d'oeil à la Java EE des exemples de Code & Apps.
Mise à jour: Voir Comment puis-je accéder à un Local composant EJB à partir d'un POJO? dans l'EJB de la FAQ pour plus de détails sur JNDI (en particulier le nouveau portable global noms JNDI défini par la spécification EJB 3.1).
Essayer:
Vous êtes l'instanciation de la service de haricots directement, lorsque vous avez vraiment besoin d'avoir le conteneur de l'injecter (via @EJB). Ce n'est pas pris en charge dans une JSP, cependant, de sorte que vous aurez à passer à une servlet ainsi.