entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

4votos

Llamar un EJB en pagina JSF primefaces

hola!! estoy aprendiendo java web con eclipse kepler, jpa, EJB, eclipse link a base de datos Postgres y primefaces; y trato de hacer un crud, he visto tutoriales en linea y video y he tratado de hacer algo asi:
mi Entidad (llamada Posicion y la Tabla postgres posicion)

import java.io.Serializable;
import javax.persistence.*;

@Entity
@NamedQuery(name="Posicion.findAll", query="SELECT p FROM Posicion p")
 public class Posicion implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@SequenceGenerator(name="POSICION_CODIGOPOSICION_GENERATOR", sequenceName="SEQ_GEN")
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="POSICION_CODIGOPOSICION_GENERATOR")
private Long codigoposicion;

private String estado;

private Boolean habilitado;

private Long posx;

private Long posy;

private String tiposorteo;

public Posicion() {
}

public Long getCodigoposicion() {
    return this.codigoposicion;
}

public void setCodigoposicion(Long codigoposicion) {
    this.codigoposicion = codigoposicion;
}

public String getEstado() {
    return this.estado;
}

public void setEstado(String estado) {
    this.estado = estado;
}

public Boolean getHabilitado() {
    return this.habilitado;
}

public void setHabilitado(Boolean habilitado) {
    this.habilitado = habilitado;
}

public Long getPosx() {
    return this.posx;
}

public void setPosx(Long posx) {
    this.posx = posx;
}

public Long getPosy() {
    return this.posy;
}

public void setPosy(Long posy) {
    this.posy = posy;
}

public String getTiposorteo() {
    return this.tiposorteo;
}

public void setTiposorteo(String tiposorteo) {
    this.tiposorteo = tiposorteo;
}

   }

mi clase DAO

import javax.persistence.EntityManager;

import co.com.ies.daointerface.IDaoPosiciones;
import co.com.ies.entities.Posicion;

 public class DaoPosicion implements IDaoPosiciones {

@Override
public boolean insert(EntityManager em, Posicion oPosicion)
        throws Exception {
    em.persist(oPosicion);
    return true;

}

@Override
public Posicion getByIdPosicion(EntityManager em, long codigoposicion)
        throws Exception {

    return null;
}

@Override
public boolean update(EntityManager em, Posicion oPosicion)
        throws Exception {
    em.persist(oPosicion);
    return true;
}

@Override
public boolean delete(EntityManager em, Posicion oPosicion,
        long codigoposicion) throws Exception {
    // TODO Auto-generated method stub
    return false;
}

@Override
public Posicion getAllPosicion(EntityManager em, Posicion oPosicion)
        throws Exception {
    // TODO Auto-generated method stub
    return null;
}

   }

MI DAO Interface para conectar entityManager

import javax.persistence.EntityManager;

import co.com.ies.entities.Posicion;

public interface IDaoPosiciones {
    public boolean insert(EntityManager em, Posicion oPosicion )throws Exception;
    public Posicion getByIdPosicion(EntityManager em, long codigoposicion)throws Exception;
    public boolean update(EntityManager em, Posicion oPosicion)throws Exception;
    public boolean delete(EntityManager em, Posicion oPosicion, long codigoposicion)throws Exception;
    public Posicion getAllPosicion(EntityManager em, Posicion oPosicion)throws Exception;
 }

Mi clase EJB

  import java.util.List;
  import javax.ejb.Stateless;
  import javax.persistence.EntityManager;
  import javax.persistence.EntityManagerFactory;
  import javax.persistence.EntityTransaction;
  import javax.persistence.Persistence;
  import co.com.ies.dao.DaoPosicion;
  import co.com.ies.daointerface.IDaoPosiciones;
  import co.com.ies.ejbinterface.IEjbPosicion;
  import co.com.ies.entities.Posicion;

  @Stateless
  public class EjbPosicion implements IEjbPosicion {
  private EntityManagerFactory emf=null;
  private EntityManager em=null;
  private EntityTransaction et=null;

  private Posicion oPosicion;
  private List<Posicion> listaPosicion;

  @Override
  public boolean insert() {
    try {
        IDaoPosiciones idaoPosicion = new DaoPosicion();
        emf=Persistence.createEntityManagerFactory("CrudPosicion");
        em=emf.createEntityManager();
        et=em.getTransaction();
        et.begin();
        idaoPosicion.insert(em, oPosicion);
        et.commit();
        return true;

    } catch (Exception ex) {
        if (et!=null) {
            et.rollback();
        }
        System.out.println("Error al ingresar" + ex.getMessage());

        return false;
    }
    finally
    {
        if (em!=null) 
        {
            em.close();
            em=null;
        }
        if (emf!=null) {
            emf.close();
            emf=null;

        }
    }
}

Y mi Interface del EJB esta:

import java.util.List;
import javax.ejb.Local;
import co.com.ies.entities.Posicion;
@Local
public interface IEjbPosicion {
public boolean insert();

 // public boolean update();
//  public boolean delete();

public void setListaPosicion(List<Posicion> listaPosicion);
public List<Posicion> getListaPosicion();
public void setPosicion(Posicion oPosicion);
public Posicion getPosicion();
   }

Mi pagina JSF la configure asi, obviamente no esta bien definido por eso recurro a este foro para que iluminen mi COMO LLAMAR un EJB en una pagina JSF e interactuar, o si enves de usar los EJB usar Beans normales ya que es para una aplicación sencilla de intranet.

   </h:head> 
   <h:body>
    <h:form >
        <p:panel header="posicion" >
        <h:panelGrid border="0" columns="3">
            <h:outputText value="pos X:"/>
            <p:inputText value="#{EjbPosicion.idaoPosicion.posx}"
                         id="px" required="true"
                         label="posicion en X"/>
            <h:message for="px" style="color: red"/>
            <h:outputText value="Pos Y:"/>
            <p:inputText feedback="true" value="#{EjbPosicion.posy}"
                        required="true" id="py"
                        label="Posicion Y"/>
            <h:message for="py" style="color: red"/>

            <h:outputText value="Tipo Sorteo:"/>
            <p:inputText value="#{EjbPosicion.tiposorteo}"
                         id="tsorteo" required="true"
                         label="tipo sorteo"/>
            <h:message for="tsorteo" style="color: red"/>
            <h:outputText value="Habilitado:"/>
            <p:inputText feedback="true" value="#{EjbPosicion.habilitado}"
                        required="true" id="hab"
                        label="habilitado"/>
            <h:message for="hab" style="color: red"/>
            <h:outputText value="Estado:"/>
            <p:inputText feedback="true" value="#{EjbPosicion.estado}"
                        required="true" id="est"
                        label="habilitado"/>
            <h:message for="hab" style="color: red"/>

            <p:commandButton value="Grabar" action="#{EjbPosicion.insert()}" ajax="false"/>
        </h:panelGrid>
    </p:panel>
    </h:form>
    </h:body>

1 Respuesta

3votos

GusGarsaky Puntos5480

Considera el siguiente servicio (antes llamado DAO):

public interface GenericService<T, PK extends Serializable> {
    public T save(T t) throws Throwable;
    public T update(T t) throws Throwable;
    public T remove(T t) throws Throwable;
    public T find(PK pk) throws Throwable;
    public List<T> findAll(String namedQuery) throws Throwable;
}

Y su implementación:

public abstract class GenericServiceImpl<T, PK extends Serializable> implements GenericService<T, PK> {
    @PersistenceContext(unitName="CustomersPU")
    protected EntityManager em;
    protected Class<T> clazz;

    public GenericServiceImpl(Class<T> clazz) {
        this.clazz = clazz;
    }
    @Override
    public T save(T t) throws Throwable {
        em.persist(t);
        em.flush();
        return t;
    }
    @Override
    public T remove(T t) throws Throwable {
        em.remove(t);
        em.flush();
        return t;
    }
    @Override
    public T update(T t) throws Throwable {
        em.merge(t);
        em.flush();
        return t;
    }
    @Override
    public T find(PK pk) throws Throwable {
        return (T) em.find(clazz, pk);
    }
    @Override
    public List<T> findAll(String aQuery) throws Throwable {
        TypedQuery<T> query = em.createQuery(aQuery, clazz);
        return query.getResultList();
    }
}

Como nuestro servicio base es genérico, debemos de tener implementaciones concretas:

public interface CustomerService extends GenericService<Customer, Integer> {
    public List<Customer> findByDni(String dni) throws Throwable;
}

@LocalBean
@Stateless
public class CustomerServiceBean extends GenericServiceImpl<Customer, Integer> implements CustomerService {

    public CustomerServiceBean() {
        super(Customer.class);
    }
    @Override
    public List<Customer> findByDni(String dni) throws Throwable {
        TypedQuery<Customer> query = em.createNamedQuery("Customer.findByDni", Customer.class);
        query.setParameter("dni", dni);
        return query.getResultList();
    }
}

Fíjate que en nuestro servicio base (GenericServiceImpl) inyectamos el EntityManager por medio del container del servidor de aplicaciones, así, el container maneja todas las transacciones.

El atributo clazz<T>, representa la entidad con la que trabajará; en nuestro caso, Customer.class, que pasamos llamado al constructor de GenericServiceImpl.

Al ser nuestro servicio de acceso a datos un EJB, podemos inyectarlo en donde queramos:

@Named(name="customerbean")
@RequestScoped
public class CustomerBean {
    @Inject CustomerServiceBean customerServiceBean; // inyectamos su dependencia

    public List<Customer> getCustomers() {
        return customerServiceBean.findAll();
    }
}

Tan solo, lo llamamos en nuestro XHTML:

<h2><h:outputText value="Lista de clientes"/></h2>
            <p:dataTable var="item" value="#{customerbean.customers}" id="customerList"
                         paginator="true" rows="10">
                <p:column>
                    <f:facet name="header">
                        <h:outputText value=" ID" />
                    </f:facet>
                </p:column>
                <p:column>
                    <f:facet name="header">
                        <h:outputText value="Name"/>
                    </f:facet>
                    <h:outputText value="#{item.name}"/>
                </p:column>
                ... las otras columnas

Espero se haya entendido. Saludos.

german comentado Abr 10, 2015

hola gus gracias por tu aclaracion!! 2 preguntas

  1. me sale error en:

    <p:dataTable var="item" value="#{posicionB.getListaPosicion}" id="" paginator="true" rows="10">

    javax.el.PropertyNotFoundException: /index.xhtml Target Unreachable, identifier 'posicionB' resolved to null

mi controler esta asi:

@Named(name="posicionB")
@RequestScoped
public class PosicionBean {
@Inject PosicionServiceBean posicionServiceBean; // inyectamos su dependencia

public List<Posicion> getListaPosicion() {
    return posicionServiceBean.findAll();
   }
}
  1. existe un Generador EJB de una BD automaticamente

GusGarsaky comentado Abr 10, 2015

Las reglas de JSF son sencillas. al hacer: posicionB.getListaPosicion, JSF está buscando la propiedad getListaPosicion. Antes de EL (Expression Language) 2.2, solo podía accederse a métodos por medio de su propiedad, y era una regla obligatoria que si una propiedad debía ser accedida desde el facelets, debería de tener un getter. Desde EL 2.2 (Java EE 6+) ésto ya no es así. Puede hacerse de la antigua forma, o pueden llamarse métodos específicos. En tu caso, debería ser así:

<p:dataTable var="item" value="#{posicionB.getListaPosicion()}" id="" paginator="true" rows="10">

Un saludo.

PD: Error, por favor mover como comentario a mi respuesta anterior.

GusGarsaky comentado Abr 10, 2015

Ya está. Espero te sirva, un saludo.

german comentado Abr 10, 2015

Gus no aun asi sale el erro, coloco el error por consola del eclipse

2015-04-10T17:39:39.693-0500|Advertencia: #{posicionB.getListaPosicion()}: javax.el.PropertyNotFoundException: 
   /index.xhtml  @13,28 action="#{posicionB.getListaPosicion()}": Target Unreachable, identifier 'posicionB' resolved to null
    javax.faces.FacesException: #{posicionB.getListaPosicion()}: javax.el.PropertyNotFoundException: 
   /index.xhtml @13,28 action="#{posicionB.getListaPosicion()}": Target Unreachable, identifier 'posicionB' resolved to null
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)
at javax.faces.component.UICommand.broadcast(UICommand.java:315)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)

Realmente creo que voy crear un hilo para esta inquietud!!

GusGarsaky comentado Abr 10, 2015

¿Qué versión de JDK usas? Y ¿Qué RequestScoped estás importando? Si estás importando javax.faces.bean.RequestScoped reemplázalo por javax.enterprise.context.RequestScoped.

german comentado Abr 13, 2015

hola guz gracias por tus respuestas cuando le doy java -version "1.8.0_31" en consola d.o.s,pero mi proyecto lo ajuste para jdk1.7.0_21, con el compiler y java build del elipse kepler

Aca te muestro los import de manage Bean

import java.util.List;

import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;

import co.com.ies.entities.Posicion;
import co.com.ies.ejb.PosicionesEJB;

@Named(value = "posicionB")
@RequestScoped
public class PosicionesMBean {

@Inject PosicionesEJB oPosicionesEJB;

private Posicion posicion= new Posicion();

/**
 * @return lista de posiciones
 */
public List<Posicion> getAllPosicion() {
    return oPosicionesEJB.ListaPosiciones();
}

si me preguntas que JDK uso debo colocar el jdk1.7.0_21 en el JAVA_HOME??? ya lo hice. tengo los 2 jdk el 1.8 y 1.7 instalados en mi equipo... el java compiler de eclipse kepler no me acepta el 1.8

Por favor, accede o regístrate para responder a esta pregunta.

¿Conoces alguien que puede responder?
¡Comparte esta pregunta!


Otras Preguntas y Respuestas


Actividad Reciente

...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta