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:
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