Pregunta

Soy nuevo en Java EE. He intentado conseguir algunos primeros ejemplos que se ejecutan (APP). Estoy usando GlassFish v3. El problema es que no consigo la inyección servidor de aplicaciones EntityManager. Hear es un ejemplo http://www.adam-bien.com/roller/ Abien / entrada / ejb_3_persistence_jpa_for   lo que me ampliado con un cliente JSP.

Entidad:


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


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 funciono el ejemplo que conseguir un java.lang.NullPointerException en el método createOrUpdate () es por lo que el entityManager obviamente no se inyecta correctamente. He intentado encontrar un remedio para el día y ahora un poco de ayuda sería muy apreciada.

Gracias

Marcel

¿Fue útil?

Solución

Se obtiene un NullPointerException porque estás crear instancias de su BookService con un new() - que es básicamente equivocado - y nada se inyecta en el EJB. EJB son componente que son gestionados por el contenedor y deben obtenerse a través de inyección o con una búsqueda.

A continuación, mientras que la especificación JSP permite a cualquier código que se ejecuta en un scriplet, llamando a un EJB desde un JSP es en realidad no es realmente animó y JSP no lo hacen inyección apoyo. En otras palabras, usted tiene que utilizar una búsqueda:

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

Sin embargo, se debe llamar al EJB desde un servlet o una JSF Managed Bean (EJB y podría ser inyectado en tales componentes).

Si usted necesita algunas muestras, echar un vistazo a las código Java EE muestras y aplicaciones .

Actualización: ¿Cómo hacer que el acceso un componente EJB local desde un POJO? en el EJB FAQ para más detalles sobre JNDI (especialmente la nueva portátiles nombres JNDI globales definidos por la especificación EJB 3.1 ).

Otros consejos

Trate:

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

Se le instanciar el grano de servicio directamente, cuando usted realmente necesita estar teniendo el recipiente inyectarla (a través de @EJB). Esto no está soportado en un JSP, aunque, por lo que tendrá que cambiar a un servlet también.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top