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

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 <option value…=“29”) estão corretos). Estou debugando e a conversão aparentemente deveria estar ocorrendo, mas após a execução dos métodos abaixo vem a mensagem “…o valor não é válido…”.

        <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í:

[code]
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;	
}

}[/code]

Alguém pode ajudar?

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 ?

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.

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.

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í???

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?