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

20 respostas
F

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.

20 Respostas

tmvolpato

sem ver código fica difícil

F
****** 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 "";
}

}

tmvolpato

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>

F

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

tmvolpato

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

DaniloAndrade

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 "";
    }
}

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

F

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.

tmvolpato

vc fez o que eu falei?

F

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

tmvolpato

cara faltou isso

F

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

DaniloAndrade

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 "";  
    }
F

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

tmvolpato

cole a classe Receita ai
vou te mostra como se faz

F
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;
    }
}
tmvolpato

mas receita só tem descrição

o que você carrega no selectOneMenu?

F

O id da receita e sua descriçao

tmvolpato

ta ai

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

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

converter="receitaConverter"
tmvolpato

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

F

Realmente, isso resolveu meus problemas, agradeço a todos o apoio.

Criado 24 de abril de 2013
Ultima resposta 27 de abr. de 2013
Respostas 20
Participantes 3