Erro de conversão ao definir o valor .... para 'null Converter'

6 respostas
douglasrauber

Bom dia!

Galera, procurei sobre esse erro, porém, não consegui resolver!
Em um relacionamento many to one, tenho um combobox, que mostra os dados como eu quero, porém, quando tento gravar aparece o erro...
* Erro de conversão ao definir o valor '4' para 'null Converter'. O valor '4' muda conforme a seleção do combobox, porém não grava.

O xhtml em questão:
<!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://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:p="http://primefaces.prime.com.tr/ui">

<ui:insert name="menu">
	<ui:include src="/cabecalho.xhtml" />
</ui:insert>

<h:body>
	<h:panelGrid style="margin: auto">
		<h:form>
			<p:panel closable="false" header="Cadastro de Unidades">
				<h:panelGrid>
					<p:messages />
					<h:panelGrid columns="2">
						<h:outputText value="Secretaria:" />
						<h:selectOneMenu value="#{unidadeBean.secretaria}"
							immediate="true">
							<f:selectItems value="#{secretariaBean.secretarias}"
								var="secretaria" itemLabel="#{secretaria.nome}"
								itemValue="#{secretaria.id}" />
						</h:selectOneMenu>
						<h:outputText value="Nome:" />
						<h:inputText id="nome" value="#{unidadeBean.unidade.nome}"
							required="true" requiredMessage="Campo Nome é Obrigatório" />
					</h:panelGrid>
					<h:commandButton value="Cadastrar" action="#{unidadeBean.gravar}" />
				</h:panelGrid>
			</p:panel>
		</h:form>
	</h:panelGrid>
</h:body>
</html>

os Beans:

package Bean;

import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpServletRequest;
import Dao.Dao;
import Dao.DaoFactory;
import Model.Secretaria;

@ManagedBean
@SessionScoped
public class SecretariaBean {

	Secretaria secretaria = new Secretaria();

	public void gravar() {
		Dao<Secretaria> dao = new DaoFactory().getSecretariaDao();
		dao.adiciona(secretaria);
		secretaria = new Secretaria();
	}

	public List<Secretaria> getSecretarias() {
		Dao<Secretaria> dao = new DaoFactory().getSecretariaDao();
		return dao.listaTudo();
	}

	public List<SelectItem> getListaSecretaria() {
		List<SelectItem> secretarias = new ArrayList<SelectItem>();
		List<Secretaria> listaSec = getSecretarias();
		secretarias.add(new SelectItem(null, ""));
		for (Secretaria obj : listaSec) {
			secretarias.add(new SelectItem(obj, obj.getNome()));
		}
		return secretarias;
	}

	public void remover() {
		FacesContext context = FacesContext.getCurrentInstance();
		HttpServletRequest req = (HttpServletRequest) context
				.getExternalContext().getRequest();
		Long idSecretaria = new Long((req.getParameter("id")));
		Dao<Secretaria> dao = new DaoFactory().getSecretariaDao();
		dao.remove(dao.procura(idSecretaria));
	}

	public Secretaria getSecretaria() {
		return secretaria;
	}

	public void setSecretaria(Secretaria secretaria) {
		this.secretaria = secretaria;
	}

}
package Bean;

import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import Dao.Dao;
import Dao.DaoFactory;
import Model.Secretaria;
import Model.Unidade;


@ManagedBean
@SessionScoped
public class UnidadeBean {

	Secretaria secretaria;
	Unidade unidade = new Unidade();

	public void gravar() {
		Dao<Unidade> dao = new DaoFactory().getUnidadeDao();
		unidade.setSecretaria(secretaria);
		dao.adiciona(unidade);
		unidade = new Unidade();
	}
	
	public Secretaria getSecretaria() {
		return secretaria;
	}

	public void setSecretaria(Secretaria secretaria) {
		this.secretaria = secretaria;
	}

	public List<Unidade> getUnidades() {
		Dao<Unidade> dao = new DaoFactory().getUnidadeDao();
		return dao.listaTudo();
	}

	public void remover() {
		FacesContext context = FacesContext.getCurrentInstance();
		HttpServletRequest req = (HttpServletRequest) context
				.getExternalContext().getRequest();
		Long idUnidade = new Long((req.getParameter("id")));
		Dao<Unidade> dao = new DaoFactory().getUnidadeDao();
		dao.remove(dao.procura(idUnidade));
	}

	public Unidade getUnidade() {
		return unidade;
	}

	public void setUnidade(Unidade unidade) {
		this.unidade = unidade;
	}

}
e o Model:
]
package Model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name="unidade")
public class Unidade {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	Long id;
	@ManyToOne
	Secretaria secretaria;
	String nome;
	
	
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public Secretaria getSecretaria() {
		return secretaria;
	}
	public void setSecretaria(Secretaria secretaria) {
		this.secretaria = secretaria;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
}

Obrigado galera!

DRauber

6 Respostas

R

kd o atributo ‘converter’ no <h:selectOneMenu ???>

douglasrauber

Obrigado pela resposta raf4ever. Mas e o que é esse atributo ? Tive olhando o post http://www.guj.com.br/posts/list/212352.java, porém não consegui implementar.
O converter é obrigatório ?
Tenho que criar uma classe converter para cada classe do modelo que use relacionamento?

Vlw, obrigado!

DRauber

douglasrauber

Olá!

Alguém? Estou precisando concluir uma rotina com esse método, mas to empacado :?

Obrigado

DRauber

douglasrauber

Oi…

Por favor aí galera… alguma referencia?

Obrigado

DRauber

R

Obrigado pela resposta raf4ever. Mas e o que é esse atributo ? Tive olhando o post http://www.guj.com.br/posts/list/212352.java, porém não consegui implementar.
O converter é obrigatório ?
Tenho que criar uma classe converter para cada classe do modelo que use relacionamento?

Vlw, obrigado!

DRauber

Não,vc pode criar um converter ‘genérico’

Exemplo de um converter genérico:

package converter;

import java.lang.reflect.Field;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.persistence.Id;

public class EntityConverter implements Converter {  
   
     public Object getAsObject(FacesContext ctx, UIComponent component,  
             String value) {  
         if (value != null) {  
             return component.getAttributes().get(value);  
         }  
         return null;  
     }  
   
     public String getAsString(FacesContext ctx, UIComponent component,  
             Object obj) {  
         if (obj != null && !"".equals(obj)) {  
             String id;  
             try {  
                 id = this.getId(getClazz(ctx, component), obj);  
                 if (id == null){  
                     id = "";  
                 }  
                 id = id.trim();  
                 component.getAttributes().put(id,  
                         getClazz(ctx, component).cast(obj));  
                 return id;  
             } catch (SecurityException e) {  
                 e.printStackTrace();  
             } catch (IllegalArgumentException e) {  
                 e.printStackTrace();  
             } catch (NoSuchFieldException e) {  
                 e.printStackTrace();  
             } catch (IllegalAccessException e) {  
                 e.printStackTrace();  
             }  
         }  
         return null;  
     }  
   
     private Class&lt;?&gt; getClazz(FacesContext facesContext, UIComponent component) {  
         return component.getValueExpression("value").getType(  
                 facesContext.getELContext());  
     }  
   
     public String getId(Class&lt;?&gt; clazz, Object obj) throws SecurityException,  
             NoSuchFieldException, IllegalArgumentException,  
             IllegalAccessException {  
         for (Field field : clazz.getDeclaredFields()) {  
             if ((field.getAnnotation(Id.class)) != null) {  
                 Field privateField = clazz.getDeclaredField(field.getName());  
                 privateField.setAccessible(true);  
                 if (privateField.get(clazz.cast(obj)) != null) {  
                     return (String)field.getType()  
                             .cast(privateField.get(clazz.cast(obj))).toString();  
                 } else {  
                     return null;  
                 }  
             }  
         }  
         return null;  
     }  
}

Para saber mais : http://www.rponte.com.br/2008/07/26/entity-converters-pra-da-e-vender/

douglasrauber

Obrigado raf4ever!

Muito úteis suas dicas e blog!
Consegui fazer o processo que eu queria.
Não usei o converter genérico, acho que iria dificultar me meu entendimento agora…

Vlw…

Obrigado e até mais!

DRauber :stuck_out_tongue:

Criado 17 de novembro de 2010
Ultima resposta 19 de nov. de 2010
Respostas 6
Participantes 2