Olá Pessoal.
Estou tentando resolver um problema aqui. Preciso carregar o objeto selecionado em um SelectOneMenu no meu ManagedBean. Para isso estou usando um conversor e daí vem um dos clássicos problemas: “Erro de validação: o valor não é válido”. Já tentei de tudo, pesquisei em diversos foruns mas não consigo ver o erro que estou comentendo. Segue meus códigos:
TipoLogradouroConverter
@FacesConverter(value="tipoLogradouroConverter", forClass=TipoLogradouro.class)
public class TipoLogradouroConverter implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) throws ConverterException {
System.out.println(value);
if(value != null && !value.isEmpty()){
System.out.println(new TipoLogradouroDAO().busca(Integer.parseInt(value)).getDescricao());
return new TipoLogradouroDAO().busca(Integer.parseInt(value));
}
return null;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object object) throws ConverterException {
if(object != null && object instanceof TipoLogradouro && ((TipoLogradouro) object).getId() != null){
System.out.println(((TipoLogradouro) object).getId().toString());
return ((TipoLogradouro) object).getId().toString();
}
return null;
}
}
teste.xhtml - criei isso apenas para tentar resolver este problema.
<?xml version="1.0" encoding="UTF-8" ?>
<!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:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui">
<h:head>teste</h:head>
<h:body>
<h:form id="teste">
<p:dataTable value="#{enderecoBean.enderecos}" var="endereco"
paginator="true" rows="50" selectionMode="single" selection="#{enderecoBean.endereco}"
rowKey="#{endereco.id}" >
<p:ajax event="rowSelect" />
<p:column headerText="Código">
#{endereco.id}
</p:column>
<p:column headerText="Logradouro">
#{endereco.logradouro}
</p:column>
<p:column headerText="Tipo">
#{endereco.tipoLogradouro.descricao}
</p:column>
<f:facet name="footer">
<p:commandButton value="Novo Funcionário" id="newFuncionarioButton" ajax="false" >
</p:commandButton>
<p:commandButton value="Editar Funcionário" id="editFuncionarioButton" ajax="false" >
</p:commandButton>
</f:facet>
</p:dataTable>
<h:outputText value="Endereço:" />
<h:panelGrid columns="4" >
<p:selectOneMenu value="#{funcionarioBean.tipoLogradouro}" converter="tipoLogradouroConverter" >
<f:selectItem itemLabel="Selecione um Tipo de Logradouro..." itemValue="" />
<f:selectItems value="#{funcionarioBean.tiposLogradouros}" var="tipoLogradouro" itemValue="#{tipoLogradouro}" itemLabel="#{tipoLogradouro.descricao}" />
</p:selectOneMenu>
<p:inputText id="endereco" value="#{funcionarioBean.funcionario.pessoa.endereco.logradouro}" maxlength="50" size="80" />
<h:outputText value="Nº:" />
<p:inputText id="numero" value="#{funcionarioBean.funcionario.pessoa.endereco.numero}" maxlength="20" size="20" />
</h:panelGrid>
<p:commandButton value="gravar" action="#{enderecoBean.salvar}" ajax="false" update="teste" />
</h:form>
</h:body>
</html>
E meu EnderecoBean
package br.flexweb.beans;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import br.flexweb.dao.EnderecoDAO;
import br.flexweb.models.Endereco;
import br.flexweb.models.TipoLogradouro;
@ViewScoped
@ManagedBean
public class EnderecoBean {
private Endereco endereco;
private TipoLogradouro tipoLogradouro;
private List<Endereco> enderecos;
private EnderecoDAO dao = new EnderecoDAO();
public void salvar(){
endereco.setTipoLogradouro(tipoLogradouro);
dao.adicionar(endereco);
}
public Endereco getEndereco() {
return endereco;
}
public void setEndereco(Endereco endereco) {
this.endereco = endereco;
}
public TipoLogradouro getTipoLogradouro() {
return tipoLogradouro;
}
public void setTipoLogradouro(TipoLogradouro tipoLogradouro) {
this.tipoLogradouro = tipoLogradouro;
}
public List<Endereco> getEnderecos() {
if (enderecos == null)
enderecos = dao.lista();
return enderecos;
}
public void setEnderecos(List<Endereco> enderecos) {
this.enderecos = enderecos;
}
}
Minha intenção é setar um tipo de logradouro dentro de endereço, por isso uso o bean de Endereço ao invez de TipodeLogradouro.
Alguém uma sugestão?
Obrigado.