Tenho o seguinte XHTML e estou recebendo erro de validação
com as mensagens abaixo: set 24, 2014 8:09:06 PM com.sun.faces.renderkit.RenderKitUtils renderUnhandledMessages INFORMAÇÕES: AVISO: FacesMessage(s) foram enfileirados, mas podem não ter sido exibidos.
sourceId=j_idt4:modelo[severity=(ERROR 2), summary=(j_idt4:modelo: Erro de validação: o valor não é válido), detail=(j_idt4:modelo: Erro de validação: o valor não é válido)]
Abaixo está o XHTML
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head />
<h:body>
<h:form>
<fieldset>
<legend>Cadastro de automoveis</legend>
<h:panelGrid columns="2">
Modelo:
<h:selectOneMenu value="#{automovelBean.automovel.modelo}" id="modelo">
<f:selectItems value="#{automovelBean.modelos}" var="modelo" itemLabel="#{modelo.descricao}" itemValue="#{modelo}"></f:selectItems>
</h:selectOneMenu>
Ano do Modelo:
<h:inputText value="#{automovelBean.automovel.anoModelo}" id="anoModelo">
<f:convertNumber type="number" integerOnly="true" groupingUsed="false"/>
</h:inputText>
Ano de Fabricação:
<h:inputText value="#{automovelBean.automovel.anoFabricacao}" id="anoFabricacao">
<f:convertNumber type="number" integerOnly="true" groupingUsed="false"/>
</h:inputText>
Preço:
<h:inputText value="#{automovelBean.automovel.preco}" id="preco">
<f:convertNumber type="number" maxFractionDigits="2" groupingUsed="false"/>
</h:inputText>
<h:commandButton value="Salvar" action="#{automovelBean.salvar}"/>
</h:panelGrid>
</fieldset>
</h:form>
<h:form>
<h:dataTable value="#{automovelBean.automoveis}" var="automovel">
<h:column>
<f:facet name="header">ID</f:facet>
#{automovel.id}
</h:column>
<h:column>
<f:facet name="header">ANO FABRICACAO</f:facet>
<h:outputText value="#{automovel.anoFabricacao}">
<f:convertNumber integerOnly="true" type="number" groupingUsed="false"/>
</h:outputText>
</h:column>
<h:column>
<f:facet name="header">ANO MODELO</f:facet>
#{automovel.anoModelo}
</h:column>
<h:column>
<f:facet name="header">PRECO</f:facet>
#{automovel.preco}
</h:column>
<h:column>
<f:facet name="header">MODELO</f:facet>
#{automovel.modelo.descricao}
</h:column>
<h:column>
<f:facet name="header">AÇOES</f:facet>
<h:commandLink value="Editar" action="editar" >
<f:setPropertyActionListener value="#{automovel}" target="#{automovelBean.automovel}"></f:setPropertyActionListener>
</h:commandLink>
</h:column>
</h:dataTable>
</h:form>
</h:body>
</html>
Meu AutomovelBeam é o abaixo
import java.io.Serializable;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.persistence.EntityManager;
import br.com.virtualinovacoes.livrojpa_exerc.dao.AutomovelDAO;
import br.com.virtualinovacoes.livrojpa_exerc.dao.ModeloDAO;
import br.com.virtualinovacoes.livrojpa_exerc.modelo.Automovel;
import br.com.virtualinovacoes.livrojpa_exerc.modelo.Modelo;
import br.com.virtualinovacoes.livrojpa_exerc.util.JSFUtil;
@ManagedBean
@ViewScoped
public class AutomovelBean implements Serializable{
/**
*
*/
private static final long serialVersionUID = 7650627329005564990L;
private EntityManager em;
private AutomovelDAO automovelDAO;
private Automovel automovel;
private List<Modelo> modelos;
private List<Automovel> automoveis;
public AutomovelBean() {
this.em = JSFUtil.getEntityManager();
this.automovel = new Automovel();
this.automovelDAO = new AutomovelDAO(this.em);
this.modelos= new ModeloDAO(em).todos();
}
public Automovel getAutomovel() {
return automovel;
}
public void setAutomovel(Automovel automovel) {
this.automovel = automovel;
}
public void salvar(){
automovelDAO.salvar(this.automovel);
}
public List<Modelo> getModelos(){
return this.modelos;
}
public List<Automovel> getAutomoveis(){
if(this.automoveis == null)this.automoveis = automovelDAO.todos();
return this.automoveis;
}
}
E tenho um convertor customizado devido ao relacionamento entre Automovel e Modelo
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.persistence.EntityManager;
import br.com.virtualinovacoes.livrojpa_exerc.modelo.Modelo;
import br.com.virtualinovacoes.livrojpa_exerc.util.JSFUtil;
@FacesConverter(forClass=Modelo.class)
public class ModeloConverter implements Converter {
EntityManager em = JSFUtil.getEntityManager();
@Override
public Object getAsObject(FacesContext arg0, UIComponent arg1, String value) {
if(value == null)return null;
Modelo modelo = em.find(Modelo.class, Integer.parseInt(value));
return modelo;
}
@Override
public String getAsString(FacesContext arg0, UIComponent arg1, Object value) {
Modelo modelo = (Modelo) value;
if(modelo== null || modelo.getId()== null) return null;
return String.valueOf(modelo.getId());
}
}