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.

0voto

german comentado

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

0voto

GusGarsaky comentado

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.

0voto

GusGarsaky comentado

Ya está. Espero te sirva, un saludo.

0voto

german comentado

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!!

0voto

GusGarsaky comentado

¿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.

0voto

german comentado

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.

Otras Preguntas y Respuestas


...

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

Conecta