Valor esquisito retornado pelo Bean

8 respostas
J

No h:selectManyMenu deveria retornar uma lista com os valores vindos do banco de dados, mas o que aparece é apenas um valor tipo beans.CadastradorBean@1e48948

O trecho do código da página xhtml é esse:

<h:selectManyMenu id="cadastradorSelect">
<f:selectItems value="#{cadastradorC.lista}" />
</h:selectManyMenu><h:message for="cadastradorSelect" /

Trecho da Classe do CadastradorControlador:

...
private List lista;
   public List getLista() throws Exception {
      CadastradorDAO dao = new CadastradorDAO();
      this.lista = dao.getTodosCadastradores();
      return this.lista;
   }
...

O trecho da Classe CadastradorDao, que é usado pelo CadastradorControlador:

public List getTodosCadastradores() throws Exception {
...       
    try {
         connection = this.conn; 
         ps = connection.prepareStatement("SELECT nome FROM cadastradores");
         rs = ps.executeQuery();
         List<CadastradorBean> lista = new ArrayList<CadastradorBean>();
         while(rs.next()) {
            String nome = rs.getString(1);
            lista.add(new CadastradorBean(nome));
         }
         return lista;
      }
...

Na Classe CadastradorBean, há vários construtores, sendo que o que é utilizado pelo CadastradorDao (nesse caso) é esse:

...  
   private String id; 
   private String nome;
   private String senha;
    
   public CadastradorBean(String nome) {
      this.nome = nome;    
   }
  ...

Meu arquivo facex-config.xml:

<managed-bean>
        <managed-bean-name>cadastrador</managed-bean-name>
        <managed-bean-class>beans.CadastradorBean</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
    
    <managed-bean>
        <managed-bean-name>cadastradorC</managed-bean-name>
        <managed-bean-class>controladores.CadastradorControlador</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>

Alguém consegue ver onde estou errando? Qualquer ajuda seria bem vinda, estou começando ainda com o JSF…
Desde já, obrigado!

8 Respostas

L

Esse é o retorno do método toString padrão. Para arrumar isso vc tem algumas opções:

Sobrescreve o método toString na classe CadastradorBean para exibir um nome mais simples:

class CadastradorBean { public String toString() { return this.nome; // Por exemplo } }

Ou altera o f:selectItems informando o atributo da descrição do select:

<f:selectItems value="#{cadastradorC.lista}" var="c" itemLabel="#{c.nome}" />
J

Thanks in advance, lsjunior.

Vou testar aqui, qualquer coisa aviso!

J

Funcionou, obrigado!

Mudei para SelectOneMenu para dar o resultado que eu queria.

Ficou assim:

<h:selectOneMenu id="cadastradorSelect">
<f:selectItems value="#{cadastradorC.lista}" var="c" itemLabel="#{c.nome}" />
</h:selectOneMenu><h:message for="cadastradorSelect" />

Valeu lsjunior, pela paciência!

L

Tem que ver como vc fez, pelo bean ou pelo f:selectItems.

J

Para capturar o valor selecionado pelo usuário, é aqui que deve estar a captura?

<h:selectOneMenu id="cadastradorSelect" value="#{beanQueVaiGuardarCadastrador.nome}">

Valeu!

L

Sim, só fica atendo para o tipo.

Se vc tem um bean tipo esse:

class Pessoa { Integer id; String nome; }

E faz isso:

<h:selectOneMenu id="pessoa" value="#{cadastroBean.pessoa}"> <f:selectItems value="#{pessoaBean.pessoas}" var="p" itemLabel="#{p.nome}" /> </h:selectOneMenu>
O CadastroBean deve ser assim:

class CadastroBean { void setPessoa(Pessoa pessoa)... }

Mas se faz isso:

<h:selectOneMenu id="pessoa" value="#{cadastroBean.pessoaId}"> <f:selectItems value="#{pessoaBean.pessoas}" var="p" itemValue="#{p.id}" itemLabel="#{p.nome}" /><!-- O valor é o ID --> </h:selectOneMenu>
O CadastroBean deve ser assim:

class CadastroBean { void setPessoaId(Integer pessoaId)... }

J

lsjunior, obrigado. Você comentou uma futura dúvida minha.

Existe um tabela no BD para o Cadastrador, e outra para o Cliente. Porém, na tabela Cliente, existe uma chave estrangeira que aponta para o ID do Cadastrador. Não existe Cliente sem um Cadastrador associado a ele.

Então, no formulário do cadastro do Cliente, é obrigatório escolher um Cadastrador. Daí minha necessidade de exibir todos os Cadastradores nesse SELECT. Entretanto, estou exibindo os NOMES, e através do DAO/CONTROLADOR/ETC teria que buscar o ID correspondente aquele NOME do Cadastrador.

Com Scriptlets/JSP (HTML puro) era mais “fácil”, por assim dizer, pois no SELECT do HTML simples, eu exibia os nomes para o usuário, porém, o valor do SELECT era o ID relativo ao nome.

Como estou usando JSF/PrimeFaces, ainda vou verificar como aplico essa “técnica”. :slight_smile:

Imagino que seja o que você colocou no código:

<f:selectItems value="#{pessoaBean.pessoas}" var="p" itemValue="#{p.id}" itemLabel="#{p.nome}" /><!-- O valor é o ID -->

É por aí… Vou testar…
Obrigado pela paciência!

L

Na verdade postei para vc ver que pode definir diretamente como Bean, no caso Pessoa,, ou como um tipo nativo. O problema de colocar como Bean é que vc deve criar um Converter para o JSF saber o que fazer quando pegar o valor da tela e voltar para o Java.

Continuando:
<h:selectOneMenu id="pessoa" value="#{cadastroBean.pessoa}" converter="pessoaConverter">  <!-- Adicionamos o converter -->
  <f:selectItems value="#{pessoaBean.pessoas}" var="p" itemLabel="#{p.nome}" />  
</h:selectOneMenu>
@FacesConverter(value = "pessoaConverter")
public class PessoaConverter implements Converter {

	@Override
	public Object getAsObject(FacesContext context, UIComponent component, String value) {
		Pessoa pessoa = new Pessoa();
		pessoa.setId(Integer.valueOf(value)); // Ou pega do banco
		return pessoa;
	}
	
	@Override
	public String getAsString(FacesContext context, UIComponent component, Object value) {
		Pessoa pessoa = (Pessoa) value;
		return pessoa.getId().toString();
	}	
}

Eu acho dessa forma um saco de fazer, prefiro setar as propriedades em tipos 'nativos' e recuperar apenas os necessários. No seu caso tanto para ver o valor atual no select como para setar no bean vc não precisa da Pessoa em si, apenas do identificador.

Criado 24 de fevereiro de 2012
Ultima resposta 24 de fev. de 2012
Respostas 8
Participantes 2