JSF/Toplink, erro na conversão de ID!

5 respostas
leorbarbosa

Pessoal,

implentei "Converter" para fazer a conversão de um campo ID e estou recebendo a mensagem abaixo:
sourceId=frmManutencao:idImpressora[severity=(ERROR 2), summary=(frmManutencao:idImpressora: Erro de validação: o valor não é válido), detail=(frmManutencao:idImpressora: Erro de validação: o valor não é válido)]

Verifiquei no fonte do html e a rendererização está correta (os códigos dos IDs

<h:selectOneMenu id="idImpressora" value="#{controller.trocaToner.impressora}" converter="conversorIdImpressora" required="true" requiredMessage="Impressora é obrigatória" styleClass="inputRequerido">
          <f:selectItem itemLabel="-- Selecione uma impressora --" itemValue="-1"/>                          
          <f:selectItems value="#{controller.serialModelo}" var="item" itemLabel="#{item.numeroSerial}" itemValue="#{item.idImpressora}" /> 
        </h:selectOneMenu>
Aonde "controller.trocaToner.impressora" é um atributo "ManyToOne"
@Entity(name="trocatoner")
@Table(name="tb_trocatoner")
public class TrocaToner {
	
	public TrocaToner() {
		
	}
	
	public TrocaToner(int idTrocaToner, Impressora impressora, Date dataTroca) {
		this.idTrocaToner = idTrocaToner;
		this.impressora = impressora;
		this.dataTroca = dataTroca;
	}
	
	@ManyToOne
	@JoinColumn(name="id_impressora")	
	private Impressora impressora;
...
A classe de conversão segue aí:
public class ConversorIdImpressora implements Converter {

	@Override
	public Object getAsObject(FacesContext context, UIComponent component, String value) throws ConverterException {
		Object retorno = null;
		
		if ( value == null | value.length() == 0 ) return retorno;
		
		try {
			retorno = value;
		}
		catch (ConverterException e) {
			System.err.println("Erro de conversão: " + e.getMessage());
		}
		return retorno;	
	}

	@Override
	public String getAsString(FacesContext context, UIComponent component, Object value) throws ConverterException {
		String retorno = "";
		
		if ( value == null ) return retorno;
		
		try {
			retorno = value.toString();
		}
		catch (ConverterException e) {
			System.err.println("Erro de conversão: " + e.getMessage());
		}
		return retorno;	
	}
}

Alguém pode ajudar?

5 Respostas

lele_vader

O erro é quando você cria o componente ou quando você tenta enviar o valor do select para o objeto de impressora ?

Chegou a ver se o converter é chamado ?

leorbarbosa

O erro ocorre quando clico em gravar (depois da tela renderizada), quando os métodos de conversão são chamados e daí vem a mensagem … só que na execução dos métodos nenhuma exception é lançada.

Hebert_Coelho

Aqui tem um converter que funciona: http://uaihebert.com/?p=1414&page=10

A diferença é que a ponta utiliza autocomplet do primefaces. Você pode alterar para o que quiser, como um select.

leorbarbosa

Tentei vendo o exemplo, passando o alias no “ItemValue”.

Mas daí ele rendereriza o endereço da instância em “ItemValue”. Na verdade preciso do ID (claro)…

Alguém tem alguma ideia aí???

leorbarbosa

Mudei o método conforme abaixo, e a mensagem de "valor não é válido continua…"
Informações: AVISO: FacesMessage(s) foram enfileirados, mas podem não ter sido exibidos.
sourceId=frmManutencao:idImpressora[severity=(ERROR 2), summary=(frmManutencao:idImpressora: Erro de validação: o valor não é válido), detail=(frmManutencao:idImpressora: Erro de validação: o valor não é válido)]

@Override
	public Object getAsObject(FacesContext context, UIComponent component, String value) throws ConverterException {
		Object retorno = null;
		
		if ( value == null | value.length() == 0 ) return retorno;
		
		try {
			DaoImpressora dao = new DaoImpressora();
			retorno = dao.getImpressoraById( Integer.parseInt(value) );
		}
		catch (ConverterException e) {
			System.err.println("Erro de conversão: " + e.getMessage());
		}
		return retorno;	
	}

Alguém tem uma dica?

Criado 8 de agosto de 2012
Ultima resposta 10 de ago. de 2012
Respostas 5
Participantes 3