SelectOneMenu nao esta carregando os dados do banco

11 respostas
E

por favor me ajudem, estou fazendo o meu TCC em java e estou com um problema, ja tentei de varias formas e nada…

o que eu preciso é carregar um SelectOneMenu de empresas na xhtml de Inserirpessoas…

Meu ManagerBean de Empresas

@Named(value = "empresaBean")
@SessionScoped
public class EmpresaBean implements Serializable {

    @EJB
    private EmpresaDAO empresaDAO;
    private Empresa empresa = new Empresa();
    private List<Empresa> empresas;
    private List<SelectItem> listaEmpresa;

   public EmpresaBean(){
        listaEmpresa = new ArrayList<SelectItem>();
        listaEmpresa = getLista();
   }

    private List<SelectItem> getLista() {
        List<SelectItem> lista = new ArrayList<SelectItem>();
        List<Empresa> resultado =  (List<Empresa>) empresaDAO.listar();
        lista.clear();
        for (Empresa teste : resultado) {
            SelectItem item = new SelectItem(teste.getCodigo(), teste.getDescricao());
            lista.add(item);
        }
        return lista;
    }

uma duvida precisa dos get e set do listaEmpresa ?

meu xhtml inserirPessoa

<h:selectOneMenu value="#{pessoaBean.pessoa.empresa}" required="true" requiredMessage="Informe a Empresa" >
                        <f:selectItems  value="#{empresaBean.listaEmpresa}"/>
                    </h:selectOneMenu>

fica em branco não aparece nada…

11 Respostas

Hebert_Coelho

Vc testou? Qual foi o resultado?

E

já testei de todas as maneiras e vi que debugando o empresaDAO.listar();

retorna NullPointerException

eu uso esse mesmo metodo listar da jsf de empresas e ele carregar normal

eu reparei que o EntityManager em;
esta retornando null

uma pergunta eu posso chamar um metodo do DAO de empresas do ManagerBean de Pessoas ?
o Scoped é de session mesmo que eu devo usar ?

Hebert_Coelho

@SessionScoped pode ser utilizado para diversos fins, do modo como você está utilizando está correto.

Como você está injetando o seu entityManager?

E

seria isso ? estou usando o hibernate…

@PersistenceContext(unitName=“TCCPU”)
private EntityManager em;

Hebert_Coelho

E como que está o código que funciona?

E
@Named(value = "empresaBean")
@SessionScoped

public class EmpresaBean implements Serializable {

    @EJB
    private EmpresaDAO empresaDAO;
    private Empresa empresa = new Empresa();
    private List<Empresa> empresas;

    public List<Empresa> getEmpresas() {
        empresas = empresaDAO.listar();
        return empresas;
    }

aqui ele funciona blz que é chamado da xhtml de listarEmpresas

vou postar o codigo novamente que fiz algumas alteracoes…

Hebert_Coelho

E como está o método listar? E como está o método que dá erro?

E

eu alterei em vez de usar o ManagerBean de empresa para carregar o list passei para o ManagerBean de pessoas
e nele estou usando o DAO da empresa… isto esta correto ?

@Named(value = "pessoaBean")
@SessionScoped
public class PessoaBean implements Serializable {

    @EJB
    private PessoaDAO pessoaDAO;
    @EJB
    private EmpresaDAO pEmpresaDAO;
    private Pessoa pessoa = new Pessoa();
    private List<Pessoa> pessoas;
    private List<SelectItem> selectItems =  new ArrayList<SelectItem>();

    public PessoaBean(){                
        selectItems = fillSelectItems();
    }

    public List<SelectItem> fillSelectItems(){
        ArrayList<SelectItem> lista = new ArrayList<SelectItem>();
        List<Empresa> resultado =  pEmpresaDAO.listar();
        for (Empresa teste : resultado) {
            lista.add(new SelectItem(teste.getCodigo(), teste.getDescricao()));
        }
        return lista;
    }

    /**
     * @return the selectItems
     */
    public List<SelectItem> getSelectItems() {
        return selectItems;
    }

    /**
     * @param selectItems the selectItems to set
     */
    public void setSelectItems(List<SelectItem> selectItems) {
        this.selectItems = selectItems;
    }

Meu empresaDAO

@Stateless
public class EmpresaDAO {

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

    public List<Empresa> listar() {
        List<Empresa> empresa = null;
        try {
            Query query = em.createQuery("Select c from Empresa c");
            empresa = query.getResultList();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return empresa;
    }

e no meu xhtml esta assim

<h:selectOneMenu value="#{pessoaBean.pessoa.empresa.codigo}" required="true" requiredMessage="Informe a Empresa" >
                        <f:selectItems value="#{pessoaBean.selectItems}" />
                    </h:selectOneMenu>

mas da mesma forma qndu eu chamo o pEmpresaDAO.listar();
ele retorna null
o em (EntityManager) esta null debugando…

Hebert_Coelho

Então ele ta null o tempo todo? É isso?

mas da mesma forma qndu eu chamo o pEmpresaDAO.listar();
ele retorna null

E

o tempo todo não pq quando acesso a xhtml de empresas, as empresas são carregadas corretamente…
ele grava , altera e remove normal.

o EmpresaDAO completo

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package dao;

import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import model.Empresa;

/**
 *
 * @author edy
 */
@Stateless
public class EmpresaDAO {

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

    public boolean gravar(Empresa empresa){
        boolean sucesso = false;
        try {
            em.merge(empresa);
            sucesso = true;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return sucesso;
    }

    public Empresa selecionar(Long codigo){
        Empresa empresa = null;
        try {
            empresa = em.find(Empresa.class, codigo);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return empresa;
    }

    public boolean remover(Empresa empresa){
        boolean sucesso = false;
        try {
            empresa = em.find(Empresa.class, empresa.getCodigo());
            em.remove(empresa);
            sucesso = true;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return sucesso;
    }

    public List&lt;Empresa&gt; listar() {
        List&lt;Empresa&gt; empresa = null;
        try {
            Query query = em.createQuery("Select c from Empresa c");
            empresa = query.getResultList();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return empresa;
    }

}
E

Resolvido !!!
fiz direto no get do atributo segue o codigo como ficou.

meu xhtml

<h:selectOneMenu value="#{pessoaBean.pessoa.empresa.codigo}" required="true" requiredMessage="Informe a Empresa" >
                        <f:selectItems value="#{empresaBean.selectItems}" />
                    </h:selectOneMenu>

note que ele esta gravando de uma ManagerBean e buscando de outra ManagerBean…

Meu EmpresaBean que carrega os dados para o SelectOneMenu

@Named(value = "empresaBean")
@SessionScoped

public class EmpresaBean implements Serializable {

    @EJB
    private EmpresaDAO empresaDAO;
    private Empresa empresa = new Empresa();
    private List<Empresa> empresas;
    private List<SelectItem> selectItems;

    /**
     * @return the selectItems
     */
    public List<SelectItem> getSelectItems() {        
        selectItems = new ArrayList<SelectItem>();
        List<Empresa> result = empresaDAO.listar();
        for (Empresa teste : result) {
            selectItems.add(new SelectItem(teste.getCodigo(), teste.getDescricao()));
        }
        return selectItems;
    }

    /**
     * @param selectItems the selectItems to set
     */
    public void setSelectItems(List<SelectItem> selectItems) {
        this.selectItems = selectItems;
    }

acredito que o null era a falta do código : selectItems = new ArrayList();
eu tinha testando antes mas com tantos testes que fiz perdi ele ai quando acertei o método de buscar esquecia de instanciar o meu list de SelectItem

Obrigado pela ajuda abraços.

Criado 11 de abril de 2012
Ultima resposta 12 de abr. de 2012
Respostas 11
Participantes 2