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