Campo sempre inválido ou erro de conversão - JSF2 [Resolvido]

Tenho um formulario,JSF2, que sempre que eu submeto ele informa que o Campo é Obrigatório mesmo selecionando um valor, e no primeiro item ele dá erro de conversão. Em tempo estou utilizando a Ide Netbeans e gerei os hashCode,equals.

sem ver código fica difícil

****** Parte do Formulario **************
<h:outputText value=“Receita: *”/>
<h:selectOneMenu id=“receita_id” value="#{fonteArrecadacaoBean.fonteArrecadacao.receita}" required=“true” requiredMessage=“Campo RECEITA é obrigatório”>
<f:selectItem itemLabel=“Selecione uma receita”/>
<f:selectItems value="#{receitaBean.lista}" var=“r” itemLabel="#{r.descricao}" itemValue="#{r}"/>
</h:selectOneMenu>
<p:message id=“receita_idMessage” for=“receita_id” />


******** ReceitaConverter***************
package br.sysboleto.web.filter.converter;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.convert.FacesConverter;
import br.sysboleto.receita.ReceitaRN;
import br.sysboleto.receita.Receita;

@FacesConverter(forClass = Receita.class)
public class ReceitaConverter implements Converter {

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
    if (value != null && value.trim().length() > 0) {
        Integer codigo = Integer.valueOf(value);
        try {
            ReceitaRN receitaRN = new ReceitaRN();
            return receitaRN.carregar(codigo);
        } catch (Exception e) {
            throw new ConverterException("Não foi possível encontrar a receita de código " + value + "." + e.getMessage());
        }
    }
    return null;
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
    if (value != null) {
        Receita receita = (Receita) value;
        return receita.getId().toString();
    }
    return "";
}

}

vc criou o converter mas nem usou ele

cadê ele aqui?

<h:selectOneMenu id="receita_id" value="#{fonteArrecadacaoBean.fonteArrecadacao.receita}" required="true" requiredMessage="Campo RECEITA é obrigatório"> //faltou o converter <f:selectItem itemLabel="Selecione uma receita"/> <f:selectItems value="#{receitaBean.lista}" var="r" itemLabel="#{r.descricao}" itemValue="#{r}"/> </h:selectOneMenu>

Com a @FacesConverter(forClass = Receita.class) no converter, eu chamo o conversor

eu tive problema com isso
no meu caso não deu certo

tive que declarar no faces-config e no xhtml meu converter
de uma olhada na net

[quote=fkrul]****** Parte do Formulario **************

                   <h:outputText value="Receita: *"/>
                        <h:selectOneMenu id="receita_id" value="#{fonteArrecadacaoBean.fonteArrecadacao.receita}" required="true" requiredMessage="Campo RECEITA é obrigatório">
                            <f:selectItem itemLabel="Selecione uma receita"/>
                            <f:selectItems value="#{receitaBean.lista}" var="r" itemLabel="#{r.descricao}" itemValue="#{r}"/>
                        </h:selectOneMenu>
                        <p:message id="receita_idMessage" for="receita_id" />

******** ReceitaConverter***************

package br.sysboleto.web.filter.converter;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.convert.FacesConverter;
import br.sysboleto.receita.ReceitaRN;
import br.sysboleto.receita.Receita;

@FacesConverter(forClass = Receita.class)
public class ReceitaConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        if (value != null && value.trim().length() > 0) {
            Integer codigo = Integer.valueOf(value);
            try {
                ReceitaRN receitaRN = new ReceitaRN();
                return receitaRN.carregar(codigo);
            } catch (Exception e) {
                throw new ConverterException("Não foi possível encontrar a receita de código " + value + "." + e.getMessage());
            }
        }
        return null;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        if (value != null) {
            Receita receita = (Receita) value; // use um intanceOf pra saber se realmente é uma instancia de Receita 
            return receita.getId().toString();
        }
        return "";
    }
}

[/quote]

como vc tem um

 <f:selectItem itemLabel="Selecione uma receita"/>

é provável que Chegue uma String no value do método getAsString

por isso use o instanceOf antes de fazer o cast

Retirei o <f:selectItem itemLabel=“Selecione uma receita”/> , e mesmo assim não funciona, e o mais estranho é por exemplo ele retorna um select com 3 valores, se eu seleciono o primeiro dá erro de conversao, se seleciono qualquer outro ele age como se nao tivesse selecionado nada, reclama que o campo é obrigatório.

vc fez o que eu falei?

Sim, mas como tenho outro formulario que está tudo funcionando mantive.

cara faltou isso

Quero dizer, alterei o codigo, e mesmo assim nao funcionou, ai voltei para o padrao anterior

vc fez isso no seu getAsString()

@Override  
    public String getAsString(FacesContext context, UIComponent component, Object value) {  
        if (value instanceof Receita ) {  // teste pra saber se value é um instancia de Receita 

            Receita receita = (Receita) value; // use um intanceOf pra saber se realmente é uma instancia de Receita   
            return receita.getId().toString();  
        }  
        return "";  
    }  

Retirei os try do conversor e retornou isso:
WARNING: br.sysboleto.empresa.Empresa cannot be cast to br.sysboleto.receita.Receita
java.lang.ClassCastException: br.sysboleto.empresa.Empresa cannot be cast to br.sysboleto.receita.Receita

cole a classe Receita ai
vou te mostra como se faz

package br.sysboleto.receita;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Receita implements Serializable {

    @Id
    @GeneratedValue
    private Integer id;
    private String descricao;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 13 * hash + (this.id != null ? this.id.hashCode() : 0);
        hash = 13 * hash + (this.descricao != null ? this.descricao.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Receita other = (Receita) obj;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
            return false;
        }
        if ((this.descricao == null) ? (other.descricao != null) : !this.descricao.equals(other.descricao)) {
            return false;
        }
        return true;
    }
}

mas receita só tem descrição

o que você carrega no selectOneMenu?

O id da receita e sua descriçao

ta ai

[code]@FacesConverter(value=“receitaConverter”, forClass=Receita.class)
public class ReceitaConverter implements Converter {

private Receita receita = new Receita();

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {

	try{			
		receita.setId(Integer.parseInt(value));
		return receita;
		
	}catch (Exception ex){
		System.out.println(ex.getMessage());
	}		
	return null;
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
	receita = (Receita) value;
	return String.valueOf(value);
	
}  

}[/code]

no faces_config.xml
coloca assim

<converter> <converter-id>receitaConverter</converter-id> <converter-class>br.com.teste.converter.ReceitaConverter</converter-class> //br.com.teste.converter troque pelo seu pacote </converter>

e na classe Receita

public String toString() { return String.valueOf(id); }

lá no xhtml
como havia escrito

você pode estranha mas no seu caso
esse simples converter vai resolver seu problema