[RESOLVIDO]Duvidas com Converter

Boa noite pessoal!

Estou encucado com um problema de converter aqui.

O cenario é o seguinte:

Tenho uma combo-box que está sendo populado por um List, ela até é populada com os registros, mas quando aplico um converter para mostrar o nome do campo que eu gostaria (na combo) a mesa não funciona.

Segue o codigo:

Saida no Console:

[code]Hibernate:
select
count(visitante0_.idVisitante) as col_0_0_
from
visitante visitante0_ limit ?

getAsString(): 0
getAsString(): entidades.Visitante[ idVisitante=1 ]
getAsString(): entidades.Visitante[ idVisitante=2 ]
getAsString(): entidades.Visitante[ idVisitante=3 ]
getAsString(): entidades.Visitante[ idVisitante=4 ]
getAsString(): entidades.Visitante[ idVisitante=7 ][/code]

Classe com meu Converter:

[code]package converters;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import controllers.VisitanteController;
import entidades.Visitante;

@FacesConverter( value=“keyConverterVisitante” )
public class VisitanteConverter implements Converter{

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
	Visitante visitante;
	if(value.equals("0")){
		visitante = new Visitante();
	}else{
	// will throw new IllegalArgumentException if it can't parse.
		System.out.println(">> getAsObject(): " + value);
		VisitanteController visitanteController = new VisitanteController();
		visitante = visitanteController.getVisitanteByNome(value);
	}

// return c;
return visitante;
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
	System.out.println(">> getAsString(): " + value);

// TipoQuarto tipoQuarto = (TipoQuarto) value;
// return tipoQuarto.getDescricao();
return value.toString();
}

}
[/code]

Metodo que retorna a Query:

public Visitante getVisitanteByNome(String nome) { System.out.println(">> " + nome); Query q = entityManager.createQuery("SELECT tq FROM Visitante tq WHERE tq.nome = :nome"); q.setParameter("nome", nome); return (Visitante) q.getSingleResult(); }

Por exemplo eu tenho outro converter e funciona numa boa em outra combo.
O resultado deste outro e exibido abaixo:

[code]Hibernate:
select
count(tipoquarto0_.idTipo) as col_0_0_
from
tipo_quarto tipoquarto0_ limit ?

getAsString(): 0
getAsString(): Simples
getAsString(): Luxo
getAsString(): Estudante
getAsString(): Intermediario
getAsString(): King[/code]

Gostaria de realizar essa conversao com foi mostrado na saida de console acima, mas já nao sei o que pode estar errado.

Obrigado e abraço a todos.

Olá amigo,

Isso ocorre porque o return value.toString() no método getAsString está chamando o método toString da sua classe Visitante e essa String é passada para o método de cima getAsObject na variável value.

Pelo que pude entender agora você está fazendo um conversor para visitantes e não para quartos, então o que você pode fazer para pegar os valores do objeto é algo parecido com isso:

@FacesConverter( value="keyConverterVisitante" )
public class VisitanteConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        Visitante visitante;
        if(value == null) {
            visitante = new Visitante();
        } else {
            System.out.println(">> getAsObject(): " + value);//o valor retornado pelo metodo getAsString agora esta armazenado na variavel value
            VisitanteController visitanteController = new VisitanteController();
            visitante = visitanteController.getVisitanteByNome(value);
        } return visitante;  
    }  
      
    @Override  
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        try {
            Visitante visitante = (visitante) value;
            return visitante.getNome();//pega o nome do seu visitante
        } catch (Exception e) {
            return null;
        }
    }
  
}

Enfim, o que você precisa é pegar o parâmetro de busca (neste caso o nome do visitante) e envia-lo pelo método getAsString para o método getAsObject onde será utilizado como parâmetro de busca no método getVisitanteByNome da classe VisitanteController.

Esse é um meio de se trabalhar com conversores e não sei se consegui me fazer entender, mas espero ter ajudado.

Té mais.

Olá M@C!

Obrigado pela sua resposta, qualquer contribuição fortalece o conhecimento em ambos os lados!!

M@C eu entendi mais ou menos o que você quis dizer, mas o que me deixa extremamente intrigado é que eu estou usando o mesmo tipo de Converter, mas para um funcionalidade chamada “Tipo Quarto”. Abaixo segue a mesma para visualização:

[code]package converters;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;

import controllers.TipoQuartoController;

import entidades.TipoQuarto;

@FacesConverter( value=“keyConverter” )
public class TipoQuartoConverter implements Converter{

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
	TipoQuarto tipoQuarto;
	if(value.equals("0")){
		tipoQuarto = new TipoQuarto();
	}else{
	// will throw new IllegalArgumentException if it can't parse.
		System.out.println(">> getAsObject(): " + value);
		TipoQuartoController tipoQuartoController = new TipoQuartoController();
		tipoQuarto = tipoQuartoController.getTipoQuartoByDescricao(value);
	}

// return c;
return tipoQuarto;
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
	System.out.println(">> getAsString(): " + value);

// TipoQuarto tipoQuarto = (TipoQuarto) value;
// return tipoQuarto.getDescricao();
return value.toString();
}

}[/code]

Quando eu a utilizo o funcionamento é um sucesso! Mas quando vou tentar para outros tipos a conversão fracassa.

Tentei implementar sua solução, mas infelizmente não obtive resultados

Abraço e obrigado pela colaboração!

e ai manolo,

O que deu errado quando você tentou o que sugeri?

Valeu.

Bom dia M@C!

Cara, resolvi o problema! Foi uma besteira, mas vc acabou abrindo meus olhos para o metodo toString().

O que aconteceu foi o seguinte, nas minhas entidades eu tinha sub-escrito o toString() e estava dando o retorno errado para ele, ai modifiquei o retorno e foi batata! Funcionou na hora.

Obrigado pela atenção e colaboração.

Sucesso! :smiley: