Pegar valor correto de um Bean e consertar o p:autoComplete

Depois de muito tentar, consegui implementar um autoComplete do PrimeFaces na minha aplicação. Porém, funciona de um modo diferente do que eu esperava. Aqui está ele resumido:

<p:autoComplete value="#{eleitor.endereco_id}" id="enderecoInput" completeMethod="#{enderecoC.complete}" var="e" itemLabel="#{e.descricao}#{' '}#{e.cep}#{' '}#{e.bairro_nome}" itemValue="#{e}" converter="#{enderecoConverter}"  />

Independente das sugestões que ele mostre ao usuário, o que eu preciso salvar no banco é o id do bean Endereco. Aqui começa a dúvida. Qual é o valor que vai ser enviado ao tentar salvar na minha action do command button? O valor contido em value={#""} ou o valor contido em itemValue={#""} ?

Outra surpresa é, por quê eu consigo concatenar atributos do Bean endereco (por mim está ótimo desse jeito) no itemLabel, sendo que no meu Converter eu apenas retorno um único atributo String, que é o atributo descricao? Aqui está ele, resumido:

public String getAsString(FacesContext fc, UIComponent uic, Object o) {
        
   EnderecoBean eb = new EnderecoBean();
   eb = (EnderecoBean)o;
   return eb.getDescricao();
        
}

Ele retorna apenas o atributo descricao do EnderecoBean, porém, no itemLabel do p:autoComplete eu consigo concatenar todos os atributos do bean. Por quê isso? Entretanto, o que eu preciso salvar mesmo é o id do EnderecoBean, que é a chave primária da tabela de endereços que deve estar contida no #eleitor.endereco.id
Porém, quando tento salvar ele me retorna a exception do outro método do Converter, que eu não precisei usar pois o autoComplete está funcionando (mais ou menos). O método é esse:

public Object getAsObject(FacesContext fc, UIComponent uic, String string) {
        throw new UnsupportedOperationException("Not supported yet.");
}

Qual é a relação de estar retornando essa exception com o minha Action salvar?

<p:commandButton id="cadEleitorButton" value="Cadastrar" action="#{eleitorC.salvar(eleitor)}" />

O método que salva o Bean Eleitor no banco segue a mesma lógica de salvar o Bean Cadastrador, porém o Cadastrador é salvo normalmente, mas o Eleitor não, e ainda me retorna a exception do Converter.
Salvar o Cadastrador (funciona normalmente):

public String salvar(CadastradorBean cadastrador) {
      
       try {
          CadastradorDAO dao = new CadastradorDAO();
          dao.salvar(cadastrador);
          return "sucesso";
       }
       catch(Exception e) {
          System.out.println("Falha ao tentar salvar cadastrador! " + e);
          return "fracasso";
       }
        
    }

Salvar o Eleitor: (não salva, retorna uma exception do Converter):

public String salvar(EleitorBean eleitor) {
      
       try {
          EleitorDAO dao = new EleitorDAO();
          dao.salvar(eleitor);
          return "sucesso";
       }
       catch(Exception e) {
          System.out.println("Falha ao tentar salvar eleitor! " + e);
          return "fracasso";
       }
        
    }

Se alguém puder me ajudar a esclarecer esses problemas, desde já agradeço!

Fala javadalberto, blz?

Cara, o converter vai usar o método que vc não implementou sempre que submeter o form… Por isso a exception gerada. Vc mesmo dispara a exception…

public Object getAsObject(FacesContext fc, UIComponent uic, String string) {  
        throw new UnsupportedOperationException("Not supported yet.");  
} 

Por outro lado, acho que deveria implementar seu converter diferente. O metodo getAsString() deveria retornar um identificador do objeto, que ao recuperá-lo no método getAsObject() possa identificar seu objeto em um repositório, um banco de dados por exemplo.

Eu entendo desta forma.

Espero ter ajudado.

Julianno

juliannoms, mas o autoComplete está funcionando. Mesmo eu retornando apenas uma String no Converter, consigo concatenar todos os atributos contidos no objeto var. Só não está funcionado o salvar da action. Não sei onde deve pegar o id do EnderecoBean, se é no value do autoComplete ou no atributo var…

Então cara…

O auto complete pode até funcionar…
A dúvida é: quando submetido você tem o objeto do lado do servidor pra trabalhar ele? No método salvar o objeto existe? Ele está completo?

Suponhamos que você coloque um componente para mostrar todas as cidades com auto complete. O que o usuário vê na tela é o nome da cidade (e é a informação que vai auto completar). Porém para a aplicação o nome pouco importa, concorda?
Usando um banco de dados, por exemplo, o que vai importar é a chave primária da cidade para que possa criar a referência para a cidade…

Ficou muito confuso?
É isso aí!

Julianno

A aplicação pega o id correto do EnderecoBean, porém não salva por causa dessa exception citada…

Bom, se seu problema é a exception…

public Object getAsObject(FacesContext fc, UIComponent uic, String string) {    
        // é aqui que você dispara a exception...
        // comente essa linha...
        //throw new UnsupportedOperationException("Not supported yet.");    
        // retorne alguma coisa...
       return null;
} 

Assim a exceção não será lançada.
Lembrando que o método acima deveria retornar um objeto do tipo que você está convertendo.

Julianno