JSF - Converter um numero para enum, nao estou conseguindo

0 respostas
K

ola pessoal
eu tenho as seguintes classes
Email

package br.com.krusst.precadastro.bean;


public class Email {

    private int id;
    private String descr;
    private ContatoTipo tipoId;

    public Email() {
		super();
	}
	public Email(int id, String descr, ContatoTipo tipoId) {
		super();
		this.id = id;
		this.descr = descr;
		this.tipoId = tipoId;
	}
	public int getId() {
		return id;
	}
	public String getDescr() {
		return descr;
	}
	public ContatoTipo getTipoId() {
		return tipoId;
	}
	public void setId(int id) {
		this.id = id;
	}
	public void setDescr(String descr) {
		this.descr = descr;
	}
	public void setTipoId(ContatoTipo tipoId) {
		this.tipoId = tipoId;
	} 
	
	public void setEmailLimpa() {
		this.id = 0;
		this.descr = "";
		this.tipoId = ContatoTipo.INICIO;
	}
}

TipoContato

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);  
   } 	 
}

PessoaFisica

...
//tive que deixar essa funcao na PessoaFisica, pois quando coloco ela na enum TipoCOntato, me gera erro
	public Map getContatoTipoEmailLista() {
		//Map<String, ContatoTipo> est = new HashMap<String, ContatoTipo>();
		Map<String, String> est = new HashMap<String, String>();
		//ENQUANTO EXISTIR VALOR NO ENUM, ELE LISTA
		for (ContatoTipo type : ContatoTipo.values()) {
			//POR **, TODO ENUM TERMINA EM "FIM", ENTAO QUANDO ENCONTRAR "FIM", ELE SAI DO LOOP
			if (type == ContatoTipo.FIM){break;};
				if (type.getTipo()!=1){
					est.put(type.getDescr(),Integer.toString(type.getId()));					
				}
		} 
		return est; 
	}
...

pagina.jsp

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

desta forma, qdo eu submeto o formulario, eu tenho o seguinte erro

form:emailTipoId1: '0' must be convertible to an enum from the enum that contains the constant 'FIM'. form:emailTipoId2: '0' must be convertible to an enum from the enum that contains the constant 'FIM'.

sei que o erro é por que eu estou passando um inteiro para o enum, porem, como eu faco essa conversao?
eu tenho o metodo “getContatoTipoPorId” que retorna o enum, porem, eu nao consegue utilizar ele pra fazer a conversao

tente fazer isso

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

mas da erro

como eu faco essa conversao?

obs.:isso funcionava antigamente qdo eu usava o ENUm como value, porem, por causa da validacao no Front-end em JS, eu preciso deixar com o Numero mesmo como value.

abs
T+

Criado 20 de maio de 2008
Respostas 0
Participantes 1