[RESOLVIDO]Duvidas com Converter

4 respostas
M

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:

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 ]

Classe com meu Converter:

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();
	}

}

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:

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

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.

4 Respostas

M

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.

M

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:

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();
	}

}

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!

M

e ai manolo,

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

Valeu.

M

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:

Criado 27 de novembro de 2012
Ultima resposta 28 de nov. de 2012
Respostas 4
Participantes 2