[RESOLVIDO] Null Converter

Boa noite,

Estou com o seguinte problema, o conversor personalizado não funciona e
gera a exception:
java.lang.ClassCastException: java.lang.String cannot be cast to br.com.sexshop.model.Categoria
Abaixo segue o código para melhor entendimento:

fragmento do código : Produto.xhtml

<h:outputLabel value="Categoria" for="categoria"/>
<h:selectOneMenu id="categoria" value="#{produtoBean.produto.categoria}" required="true" requiredMessage="Informe o campo Categoria!">
	<f:converter converterId="CategoriaConverter"/>
	<f:selectItem itemValue="" itemLabel="Selecione"/>
	<f:selectItems value="#{produtoBean.categorias}" var="categoria" itemValue="#{categoria.id_categoria}" itemLabel="#{categoria.nome}"/>
</h:selectOneMenu>

CategoriaConverter.java

@FacesConverter(value="categoriaConverter")
public class CategoriaConverter implements Converter {
	@Override
	public Object getAsObject(FacesContext context, UIComponent component, String value) {
		if(value != null && value.trim().length() > 0){
			int codigo = Integer.parseInt(value);
			try {
				CategoriaRN rn = new CategoriaRN();
				return rn.categoria_id(codigo);
			} catch (Exception e) {
				throw new ConverterException("Não foi possivel encontrar a categoria de código "+value+"."+e.getMessage());
			}
		}
		return null;
	}

	@Override
	public String getAsString(FacesContext context, UIComponent component, Object value) {
		if(value != null){
			Categoria categoria = (Categoria) value;
			return ""+categoria.getId_categoria();
		}
		return "";
	}
}

Fragmento do FacesConfig.xml

<converter>  
	<converter-id>CategoriaConverter</converter-id>  
	<converter-class>br.com.sexshop.conversores.CategoriaConverter</converter-class>  
</converter>

Qualquer ajuda é bem vinda. Grato

O nome do converter na view esta em maiúsculo tem que ser o mesmo nome que esta no seu converter:

<f:converter converterId="categoriaConverter"/>

rafael_jesus,

Coloquei conforme estava na classe(categoriaConverter) porém continua o mesmo erro:

Dá uma olhada nesse converter https://github.com/rafaeljesus/agile2go/blob/master/src/main/java/br/com/scrum/controller/converter/ProjectConverter.java

Posta o código que vc monta o seu selectItems categoria

ja tentei de duas maneiras e até agora nada.

1º Carregando uma List

Produto.xhtml

<h:outputLabel value="Categoria" for="categoria"/>  
<h:selectOneMenu id="categoria" value="#{produtoBean.produto.categoria}" required="true" requiredMessage="Informe o campo Categoria!">  
    <f:converter converterId="CategoriaConverter"/>  
    <f:selectItem itemValue="" itemLabel="Selecione"/>  
    <f:selectItems value="#{produtoBean.categorias}" var="categoria" itemValue="#{categoria.id_categoria}" itemLabel="#{categoria.nome}"/>  
</h:selectOneMenu> 

MeuBean

public List<Categoria> getCategorias() {
	CategoriaRN rn = new CategoriaRN();
	this.categorias = rn.listar(null);//null pq não quero filtrar as categorias;
	return categorias;
}

2º Carregando uma List

Produto.xhtml

<h:outputLabel value="Categoria" for="categoria"/>  
<h:selectOneMenu id="categoria" value="#{produtoBean.produto.categoria}" required="true" requiredMessage="Informe o campo Categoria!">  
    <f:converter converterId="CategoriaConverter"/>  
    <f:selectItem itemValue="" itemLabel="Selecione"/>  
    <f:selectItems value="#{produtoBean.categoriaSelect}"/>
</h:selectOneMenu> 

MeuBean

[code]
public List getCategoriaSelect() {
if(this.categoriaSelect == null){
this.categoriaSelect = new ArrayList();
CategoriaRN rn = new CategoriaRN();
List categorias = rn.listar(null);
this.montaDadosSelect(this.categoriaSelect, categorias);
}
return categoriaSelect;
}

private void montaDadosSelect(List select, List categorias){
SelectItem item = null;
if(categorias != null){
for (Categoria categoria : categorias) {
item = new SelectItem(categoria, categoria.getNome());
item.setEscape(false);
select.add(item);
}
}
}[/code]

Conforme descrito acima já tentei das 2 maneiras e até agora nada.

Esse converter aqui eu sei que funciona: JSF: Converter e Bean Auto Complete.

^^

Sempre utilizei dessa forma e nunca deu problema.

Hebert Coelho,

Dei uma olhada no seu post, adaptei ao meu código porem o erro ainda persiste,
Erro:

java.lang.String cannot be cast to br.com.sexshop.model.Categoria

Vi aqui no seu blog um converter usando forClass, este se parece mais com o meu código porem da no mesmo erro.
LINK: http://uaihebert.com/?p=1414&page=10

Se não estou enganado, segundo o log acima, diz que não conseguiu converter uma String para um objeto Categoria correto?

[quote=thayson.silva]Hebert Coelho,

Dei uma olhada no seu post, adaptei ao meu código porem o erro ainda persiste,
Erro:

java.lang.String cannot be cast to br.com.sexshop.model.Categoria

Se não estou enganado, segundo o log acima, diz que não conseguiu converter uma String para um objeto Categoria correto?[/quote]Exato. Olhando o seu codigo, em que lugar você poderia receber uma String mas você está recebendo uma categoria?

Uma dica? faz um debug aí no converter. Veja c ele é chamado. Se não for, o problema está na página. ^^

Grato a ajuda Hebert Coelho e rafael_jesus por terem me ajudado.

Consegui resolver o problema usando: @FacesConverter(forClass = Categoria.class)

Para que outras pessoas não passem pelo que passei vou dar uma detalhada na resolução do problema com o código abaixo:

Resolução

Fragmento da página.xhtml

<h:outputLabel value="Categoria" for="categoria"/>
<h:selectOneMenu id="categoria" value="#{produtoBean.produto.categoria}" required="true" requiredMessage="Informe o campo Categoria!">
	<f:selectItem itemValue="" itemLabel="Selecione"/>
	<f:selectItems value="#{produtoBean.categoriaSelect}"/>
</h:selectOneMenu>

MeuBean

public List<SelectItem> getCategoriaSelect() {
	if(this.categoriaSelect == null){
		this.categoriaSelect = new ArrayList<SelectItem>();
		CategoriaRN rn = new CategoriaRN();
		List<Categoria> categorias = rn.listar(null);
		this.montaDadosSelect(this.categoriaSelect, categorias);
	}
	return categoriaSelect;
}

private void montaDadosSelect(List<SelectItem> select, List<Categoria> categorias){
	SelectItem item = null;
	if(categorias != null){
		for (Categoria categoria : categorias) {
			item = new SelectItem(categoria, categoria.getNome());
			item.setEscape(false);
			select.add(item);
		}
	}
}

Converter

@FacesConverter(forClass = Categoria.class)
public class CategoriaConverter implements Converter {
	@Override
	public Object getAsObject(FacesContext context, UIComponent component, String value) {
		if(value != null && value.trim().length() > 0){
			int codigo = Integer.parseInt(value);
			try {
				CategoriaRN rn = new CategoriaRN();
				return rn.categoria_id(codigo);
			} catch (Exception e) {
				throw new ConverterException("Não foi possivel encontrar a categoria de código "+value+"."+e.getMessage());
			}
		}
		return null;
	}

	@Override
	public String getAsString(FacesContext context, UIComponent component, Object value) {
		if(value != null){
			Categoria categoria = (Categoria) value;
			return ""+categoria.getId_categoria();
		}
		return "";
	}
}

Obrigado pela força pessoal