Fórum SelectOneMenu dinâmico #507799

19/01/2015

0

Olá pessoal,

Preciso exibir em um SelectOneMenu, de uma página de cadastro, todas as profissões gravadas no banco. Trata-se de uma página de cadastro de clientes que tem este componente disponível para o usuário selecionar uma profissão para um cliente. Como meu conhecimento em Java é bem superficial, estou tendo dificuldades em conseguir isso.

Fiz o seguinte:

- Criei uma lista de profissões na classe ClienteBean:
    private List<Profissao> listaProfissoes;


- Inseri o método get:
    public List<Profissao> getListaProfissoes() {
        return listaProfissoes;
    }


- Na página CadastrarCliente.xhtml coloquei desta forma:

                <h:outputText value="Profissão: " />
                <p:selectOneMenu id="profissao" styleClass="profissao" value="#{clienteBean.cliente.profissao.codigo}">
                    <f:selectItem itemLabel="Selecione a profissão" itemValue="" />
                    <f:selectItems value="#{clienteBean.listaProfissoes}" var="p" itemLabel="#{p.descricao}" itemValue="#{p.codigo}" />
                </p:selectOneMenu> 


Só que quando acesso a página e clico no componente, as profissões não aparecem. Onde estou errando?

Grata.
Sgrandini

Sgrandini

Responder

Posts

20/01/2015

Randrade

Você esta usando algum Framework de persistência de dados?
Não estou vendo você retornar os dados do banco para preencher esta lista.

Algo do tipo:
List<Profissao> listaProfissoes= daoProfissoes.listar();  
Responder

Gostei + 0

20/01/2015

Sgrandini

Randrade,

Estou usando o Hibernate.

De fato, não criei classe DAO para Profissão. Mas a minha grande dúvida é onde criar esta classe. Por exemplo, minha classe ClienteDAO é uma interface e a implementação do método listar é feita em ClienteDAOHibernate.

public interface ClienteDAO {
    public void salvar(Cliente cliente);
    public void atualizar(Cliente cliente);
    public Cliente carregar(Integer codigo);
    public List<Cliente> listar();
}


public class ClienteDAOHibernate implements ClienteDAO {
    private Session sessao;
    public void setSessao(Session sessao) {
        this.sessao = sessao;
    }

    @Override
    public void salvar(Cliente c) {
        this.sessao.save(c);
    }

    @Override
    public void atualizar(Cliente c) {
        this.sessao.update(c);
    }
   
    @Override
    public Cliente carregar(Integer codigo) {
        return (Cliente) this.sessao.get(Cliente.class, codigo);
    }

    @SuppressWarnings("unchecked")
    @Override
    public List<Cliente> listar() {
        return this.sessao.createCriteria(Cliente.class).list();
    }
        
}


Devo criar então o método listar de Profissao dentro de ClienteDAO e ClienteDAOHibernate para ter acesso a lista de profissões na tela de cadastro de cliente ou crio as classes DAO especificamente para Profissao?
Responder

Gostei + 0

21/01/2015

Ronaldo Lanhellas

Randrade,

Estou usando o Hibernate.

De fato, não criei classe DAO para Profissão. Mas a minha grande dúvida é onde criar esta classe. Por exemplo, minha classe ClienteDAO é uma interface e a implementação do método listar é feita em ClienteDAOHibernate.

public interface ClienteDAO {
    public void salvar(Cliente cliente);
    public void atualizar(Cliente cliente);
    public Cliente carregar(Integer codigo);
    public List<Cliente> listar();
}


public class ClienteDAOHibernate implements ClienteDAO {
    private Session sessao;
    public void setSessao(Session sessao) {
        this.sessao = sessao;
    }

    @Override
    public void salvar(Cliente c) {
        this.sessao.save(c);
    }

    @Override
    public void atualizar(Cliente c) {
        this.sessao.update(c);
    }
   
    @Override
    public Cliente carregar(Integer codigo) {
        return (Cliente) this.sessao.get(Cliente.class, codigo);
    }

    @SuppressWarnings("unchecked")
    @Override
    public List<Cliente> listar() {
        return this.sessao.createCriteria(Cliente.class).list();
    }
        
}


Devo criar então o método listar de Profissao dentro de ClienteDAO e ClienteDAOHibernate para ter acesso a lista de profissões na tela de cadastro de cliente ou crio as classes DAO especificamente para Profissao?


Do jeito que você está trabalhando o ideal é criar um ProfissaoDAO para buscar as profissões, porém o ideal seria você mudar sua estratégia para criar um DAO Genérico, capaz de buscar qualquer coisa e não apenas profissão ou cliente.
Responder

Gostei + 0

21/01/2015

Ronaldo Lanhellas


Randrade,

Estou usando o Hibernate.

De fato, não criei classe DAO para Profissão. Mas a minha grande dúvida é onde criar esta classe. Por exemplo, minha classe ClienteDAO é uma interface e a implementação do método listar é feita em ClienteDAOHibernate.

#Código
1
2
3
4
5
6
public interface ClienteDAO {
public void salvar(Cliente cliente);
public void atualizar(Cliente cliente);
public Cliente carregar(Integer codigo);
public List<Cliente> listar();
}


#Código
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class ClienteDAOHibernate implements ClienteDAO {
private Session sessao;
public void setSessao(Session sessao) {
this.sessao = sessao;
}

@Override
public void salvar(Cliente c) {
this.sessao.save(c);
}

@Override
public void atualizar(Cliente c) {
this.sessao.update(c);
}

@Override
public Cliente carregar(Integer codigo) {
return (Cliente) this.sessao.get(Cliente.class, codigo);
}

@SuppressWarnings("unchecked")
@Override
public List<Cliente> listar() {
return this.sessao.createCriteria(Cliente.class).list();
}

}


Devo criar então o método listar de Profissao dentro de ClienteDAO e ClienteDAOHibernate para ter acesso a lista de profissões na tela de cadastro de cliente ou crio as classes DAO especificamente para Profissao?



Do jeito que você está trabalhando o ideal é criar um ProfissaoDAO para buscar as profissões, porém o ideal seria você mudar sua estratégia para criar um DAO Genérico, capaz de buscar qualquer coisa e não apenas profissão ou cliente.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar