JSF - Erro ao usar o convert

9 respostas
K

ola
estou tentando usar um convert, porem, estou tendo alguns problemas

quando click no botao de cadastro eu tenho o seguinte erro

javax.servlet.ServletException: No enum const class br.com.krusst.precadastro.bean.ContatoTipo.0
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)
	org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:147)
	org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:256)
	org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:362)
	org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:488)


root cause 

java.lang.IllegalArgumentException: No enum const class br.com.krusst.precadastro.bean.ContatoTipo.0
	java.lang.Enum.valueOf(Unknown Source)
	org.apache.el.lang.ELSupport.coerceToEnum(ELSupport.java:155)
	org.apache.el.lang.ELSupport.coerceToType(ELSupport.java:359)
	org.apache.el.ExpressionFactoryImpl.coerceToType(ExpressionFactoryImpl.java:46)
	javax.faces.component.UISelectOne.matchValue(UISelectOne.java:177)
	javax.faces.component.UISelectOne.validateValue(UISelectOne.java:137)
	javax.faces.component.UIInput.validate(UIInput.java:875)
	javax.faces.component.UIInput.executeValidate(UIInput.java:1078)
	javax.faces.component.UIInput.processValidators(UIInput.java:670)
	org.ajax4jsf.component.UIAjaxForm.processValidators(UIAjaxForm.java:80)
	org.ajax4jsf.component.AjaxViewRoot$3.invokeContextCallback(AjaxViewRoot.java:434)
	org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:234)
	org.ajax4jsf.component.AjaxViewRoot.processValidators(AjaxViewRoot.java:450)
	com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:100)
	com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:266)
	com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:132)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
	org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:147)
	org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:256)
	org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:362)
	org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:488)


note The full stack trace of the root cause is available in the Apache Tomcat/6.0.14 logs.

este erro comecou a acontecer depois que eu adicionei o seguinte convert

<h:selectOneMenu id="emailTipoId1" value="#{pessoaFisicaMB.pessoaFisica.email1.tipoId}">
	<f:selectItems value="#{pessoaFisicaMB.pessoaFisica.contatoTipoEmailLista}"/>
	<f:converter converterId="ContatoTipoConverter"/>
</h:selectOneMenu>

minha classe convert

package br.com.krusst.precadastro.util;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import br.com.krusst.precadastro.bean.ContatoTipo;


public class ContatoTipoConverter implements Converter{

	@Override
	public Object getAsObject(FacesContext context, UIComponent component, String valor) {
		//if (valor.isEmpty()){return null;}

		//return ContatoTipo.getContatoTipoPorId(valor);
		return ContatoTipo.PESSOAL;
	}

	@Override
	public String getAsString(FacesContext context, UIComponent component, Object valor) {
		//return valor.toString();
		return ContatoTipo.PESSOAL.toString();
	}

}

as parte que estao comentadas, sao as “originais” porem, nos teste, acabei colocando direto nos metodos para ver se existia erro que eu nao conseguia perceber, porem ,das 2 formas o erro é o mesmo.

meu enum ContatoTipo

package br.com.krusst.precadastro.bean;

import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;

import javax.faces.model.SelectItem;

public enum ContatoTipo implements Serializable{

	INICIO(0,"",0),
    RESIDENCIA(1,"Residencial",1),
    COMERCIAL(2,"Comercial",0),
    CELULAR(3,"Celular",1),    
    PESSOAL(4,"Pessoal",2),    
    FIM(5,"",1);
    
    private int id;
    private String descr;
    private int	tipo;
    private static Map<String, ContatoTipo> listaContatoTipoId;     
    private static Map<String, ContatoTipo> listaContatoTipoDescr;     

    static {

        listaContatoTipoId = new HashMap<String, ContatoTipo>();         
   	 //Preencho a lista com o ID e o valor do Enum
        for(ContatoTipo s : values()){listaContatoTipoId.put(Integer.toString(s.getId()), s);}
        listaContatoTipoDescr = new HashMap<String, ContatoTipo>();         
   	 //Preencho a lista com o ID e o valor do Enum
        for(ContatoTipo s : values()){listaContatoTipoDescr.put(s.getDescr(), s);}         
      } 
	ContatoTipo() {  
    }  
	
	ContatoTipo(int id, String descr, int tipo) {  
    	this.id = id;  
    	this.descr = descr;
    	this.tipo = tipo;
    }  

	public int id() {  
    	return this.id;  
    }     
	
    public String descr() {  
    	return this.descr;  
    }  	
    
    public int getId() {
		return id;
	}

	public String getDescr() {
		return descr;
	}
    
	public void setID(int id) {
		this.id = id;
	}

	public void setDescr(String descr) {
		this.descr = descr;
	}

	public int getTipo() {
		return tipo;
	}

	public void setId(int id) {
		this.id = id;
	}

	public void setTipo(int tipo) {
		this.tipo = tipo;
	}


	public static Map<String, ContatoTipo> getListaContatoTipoId() {
		return listaContatoTipoId;
	}

	public static Map<String, ContatoTipo> getListaContatoTipoDescr() {
		return listaContatoTipoDescr;
	}

	
	public static void setListaContatoTipoId(Map<String, ContatoTipo> listaContatoTipoId) {
		ContatoTipo.listaContatoTipoId = listaContatoTipoId;
	}

	public static void setListaContatoTipoDescr(Map<String, ContatoTipo> listaContatoTipoDescr) {
		ContatoTipo.listaContatoTipoDescr = listaContatoTipoDescr;
	}
	 
	public static ContatoTipo getContatoTipoPorDescr(String descr) {  
        return listaContatoTipoDescr.get(descr);  
      }  
      public static ContatoTipo getContatoTipoPorId(String id) {  
          return listaContatoTipoId.get(id);  
   } 	 

//sobre-escrevi o metodo toString, porem, nao sei se é obrigatorio, pois no exemplo tinha sido sobre-escrito      
   public String toString(){
	   return PESSOAL.getDescr();
   }
}

pessoal eu sobre-escrevi o metodo toString, porem, nao sei se é obrigatorio, pois no exemplo tinha sido sobre-escrito

bem, acho que com isso vcs ja tem as informacaoes, agora, o que eu estou fazeno de errado?
por que deste erro?

abs
T+

9 Respostas

J

esse erro deve ser pq vc está passando o id como value dos seus selecitems

assim quando ele vai comparar o valor obtido apos converter que é um enum
com os valores dos seus selectitems que são int
ele tenta converter os valores int pra enum e ocorre esse erro aí

K

jukkinha:
esse erro deve ser pq vc está passando o id como value dos seus selecitems

assim quando ele vai comparar o valor obtido apos converter que é um enum
com os valores dos seus selectitems que são int
ele tenta converter os valores int pra enum e ocorre esse erro aí

entendi
mas entao, caso eu queria converter esse 0 que seria o ID, para o ENUN, eu teira que fazer oq?
vou ter que criar uma variavel no MAnagedBeam e dela parar para a classe?

seria isso mesmo?

abs
T+

D

Krusst,

Veja se esse código te ajuda…

public class ContatoTipoConverter implements Converter {

@Override   
public Object getAsObject(FacesContext context, UIComponent component, String valor) {   

    return ContatoTipo.getContatoTipoPorId(valor);
}   

@Override   
public String getAsString(FacesContext context, UIComponent component, Object valor) {   

    if (!Util.isNullOuVazio(valor)) { // Verifica se o valor é nulo ou vazio!!

        if (valor instanceof ContatoTipo) {

            return ((ContatoTipo) valor).getId().toString();
        }

        return ContatoTipo.getContatoTipoPorId((String) valor).getId().toString();
    }

    return null;
}

}

Obs.: Qualquer coisa… Debbug pra dentro…

K

danbrasileiro:
Krusst,

Veja se esse código te ajuda…

public class ContatoTipoConverter implements Converter {

@Override   
public Object getAsObject(FacesContext context, UIComponent component, String valor) {   

    return ContatoTipo.getContatoTipoPorId(valor);
}   

@Override   
public String getAsString(FacesContext context, UIComponent component, Object valor) {   

    if (!Util.isNullOuVazio(valor)) { // Verifica se o valor é nulo ou vazio!!

        if (valor instanceof ContatoTipo) {

            return ((ContatoTipo) valor).getId().toString();
        }

        return ContatoTipo.getContatoTipoPorId((String) valor).getId().toString();
    }

    return null;
}

}

Obs.: Qualquer coisa… Debbug pra dentro…

vou fazer os teste, mas provavelmente vou ter o mesmo erro, o codigo nao é tao diferente do que eu fiz original, so a parte do instanceOf que é diferente praticamente, mas faco os teste e retorno

abs
T+

D

Krusst,

Teste e depois nos avise…

Obs.: Eu fiz esse conversor se baseando no código que você havia deixado aqui neste tópico.

K

danbrasileiro:
Krusst,

Teste e depois nos avise…

Obs.: Eu fiz esse conversor se baseando no código que você havia deixado aqui neste tópico.

bemm, tive alguns problemas
“Util”, de onde que é essa classe?
na lista,os que me aparecem nao sao compativeis
tentei com.sum.faces.util e nao deu certo
e nesta parte de codigo

return ((ContatoTipo) valor).getId().toString();
...
return ContatoTipo.getContatoTipoPorId((String) valor).getId().toString();

ele me diz que nao é possivel converter para string

abs
obrigado pela ajuda
T+

D

Opa Krusst,

Eu não passei o código exatamente para você copiar e colar em sua aplicação! Eu sugeri o que você deve fazer através do código passado…

Na linha que tem o código abaixo, eu descrevi ao lado o que a função(Util.isNullOuVazio(valor)) faz, justamente para você fazer o mesmo(só que implementado de sua forma)…
if (!Util.isNullOuVazio(valor)) { // Verifica se o valor é nulo ou vazio!!

E quanto ao que você me disse(“ele me diz que nao é possivel converter para string”), então faça um cast…

Abraço

K

danbrasileiro:
Opa Krusst,

Eu não passei o código exatamente para você copiar e colar em sua aplicação! Eu sugeri o que você deve fazer através do código passado…

Na linha que tem o código abaixo, eu descrevi ao lado o que a função(Util.isNullOuVazio(valor)) faz, justamente para você fazer o mesmo(só que implementado de sua forma)…
if (!Util.isNullOuVazio(valor)) { // Verifica se o valor é nulo ou vazio!!

E quanto ao que você me disse(“ele me diz que nao é possivel converter para string”), então faça um cast…

Abraço

bem, isso esta mais ou menos implementado, veja se vc encontra algo de errado

package br.com.krusst.util;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import br.com.krusst.precadastro.bean.ContatoTipo;


public class ContatoTipoConverter implements Converter{

	@Override
	public Object getAsObject(FacesContext context, UIComponent component, String valor) {
		if (valor.isEmpty()){return null;}
		
		ContatoTipo contatoTipo = ContatoTipo.getContatoTipoPorId(valor);

		return contatoTipo;
	}

	@Override
	public String getAsString(FacesContext context, UIComponent component, Object valor) {
		return valor.toString();
	}

}

porem, ele me retorna aquele erro usando desta forma! :S

abs
obrigado
T+

D

No método que retorna o objeto faça isso:

public Object getAsObject(FacesContext context, UIComponent component, String valor) {

return ContatoTipo.getContatoTipoPorId(valor);

}

E no método que retorna String faça algo do tipo:

public String getAsString(FacesContext context, UIComponent component, Object valor) {

if (!Util.isNullOuVazio(valor)) { // A classe utilitária que possui este método se encontra logo abaixo...

    if (valor instanceof ContatoTipo) { 

        return ((ContatoTipo) valor).getId().toString(); 
    } 

    return ContatoTipo.getContatoTipoPorId((String) valor).getId().toString(); 
} 

return null;

}

import java.util.Collection;

public class Util {

public static final String STRING_VAZIA = "";

public static boolean isNullOuVazio(Object objeto) {

if (objeto == null) {

    return true;

} else if (objeto instanceof Collection) {

    return ((Collection) objeto).isEmpty();

} else if (objeto instanceof String) {

    return ((String) objeto).trim().equals(STRING_VAZIA);
}
return false;
}

}

Criado 21 de maio de 2008
Ultima resposta 27 de mai. de 2008
Respostas 9
Participantes 3