Persistir uma lista da Classe Enum

8 respostas
C

Boa tarde a todos!

Estou desenvolvendo um sistema em Java baseado em fluxo de aprovação!
O relacionamento desse sistema consiste em: um usuários deve ter no mínimo um e no máximo n perfils!
Consegui fazer a persistência de um único perfil, mas quando mudo o campo no meu modelo do usuário para vários perfils, o sistema nem inicializa.

Segue o código para melhor visualização:

############### Modelo Perfil ############
package com.model;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public enum Perfil {
ADMINISTRADOR("ADMINISTRADOR", "Administrador"), CADASTRADOR("CADASTRADOR",
"Cadastrador"), RH("RH", "RH"), SUPERINTENDENTE("SUPERINTENDENTE",
"Superintendente"), COORDENADOR("COORDENADOR", "Coordenador"), SUPORTE(
"SUPORTE", "Suporte");

private String id_perfil;
private String tipoPerfil;
private Perfil(String id_perfil, String tipoPerfil) {
this.id_perfil = id_perfil;
this.tipoPerfil = tipoPerfil;
}

public String getId_perfil() {
return id_perfil;
}

public String getTipoPerfil() {
return tipoPerfil;
}

public static Perfil from(final String valor) {
if (valor == null) {
throw new IllegalArgumentException(
"O parametro valor não foi informado!");
}

final StringBuilder msg = new StringBuilder();
msg.append("Cannot parse into an element of StatusPerfilEnum: '")
.append(valor).append("'");

throw new IllegalArgumentException(msg.toString());
}

public static Map<String, Perfil> getMapPerfilTipoValues(){
Map<String, Perfil> mapPessoaTipo = new LinkedHashMap<String, Perfil>();
for(Perfil perfilTipo : Perfil.values()){
mapPessoaTipo.put(perfilTipo.getTipoPerfil(), perfilTipo);
}
return mapPessoaTipo;
}
 public static List<Perfil> getPerfils() {
       List<Perfil> perfis = new ArrayList<Perfil>();
       perfis.add(Perfil.ADMINISTRADOR);
       perfis.add(Perfil.CADASTRADOR);
       perfis.add(Perfil.COORDENADOR);
       perfis.add(Perfil.RH);
       perfis.add(Perfil.SUPERINTENDENTE);
       perfis.add(Perfil.SUPORTE);
       return perfis;
   }
}
############ MODELO USUÁRIO ############
@OneToMany
@ElementCollection
@Enumerated(EnumType.STRING)
private List<Perfil> perfil;
public List<Perfil> getPerfil() {
return perfil;
}

public  void setPerfil(List<Perfil> perfil) {
this.perfil = perfil;
}
############ BEAN USUARIO ###################
package com.managed.bean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import javax.faces.model.SelectItem;

import com.model.Perfil;
import com.model.User;
import com.service.IUserService;
import com.util.Util;

//@author onlinetechvision.com

@ManagedBean(name = "userMB") 
@RequestScoped
public class UserManagedBean implements Serializable {

private static final long serialVersionUID = 1L;
private static final String SUCCESS = "cadUser";
private static final String EDIT = "editUsuer";
public String labelCadastro;

// private static final String ERROR = "error";
private User user; 
private SelectItem[] opcaoPerfis;
public List<Perfil> perfils;
public List<Perfil> perfilList = new ArrayList();
public void setPerfils(List<Perfil> perfils) {
this.perfils = perfils;
}

public Perfil[] getPerfils(){
return Perfil.values();
}

public List<Perfil> getPerfilList(){
return Perfil.getPerfils();
}
public void setPerfilList(Perfil[] perfilList) {
}

private Perfil perfil;

// Spring User Service is injected...
@ManagedProperty(value = "#{UserService}")
IUserService userService;

List<User> userList;

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}
public String addUser() {

if (this.user.getSenha() == null) {
this.user.setSenha("123456");
}

// se o usuário existir atualiza
if (user.getId() != 0) {
getUserService().updateUser(this.user);
return SUCCESS;
// valida se existe p/adicionar
} else if (!getUserService().isExiteUser(this.user)) {
getUserService().addUser(this.user);
return SUCCESS;
} else {
Util.addMessage("cadastroUsuario.existente");
return null;
}
}

public String deleteUser(User user) {
getUserService().deleteUser(user);
return null;
}

public String updateUser(User user) {
getUserService().updateUser(user);
return SUCCESS;
}

public String editUser(User user) {
this.user = user;
return EDIT;
}
public String getLabelCadastro() {
if (this.user.getId() == 0) {
// return "Cadastrao de Usuário";
return Util.getBundleMessage("cadastroUsuario.label.titulo");

} else {
// return "Alteração de Cadastro";
return Util.getBundleMessage("cadastroUsuario.label.alteraUsuario");
}
}

public UserManagedBean() {
if (this.user == null) {
this.user = new User();
}
String[] stringPerfis = new String[getPerfis().length];
        int i =0;
        for (Perfil  p: getPerfis()) {
                stringPerfis[i++] = p.toString();
        }
        opcaoPerfis = criarOpcoesFiltro(stringPerfis);
}
  public SelectItem[] getOpcaoPerfis() {
           return opcaoPerfis;
   }

   public void setOpcaoPerfis(SelectItem[] opcaoPerfis) {
           this.opcaoPerfis = opcaoPerfis;
   }

   public Perfil[] getPerfis() {
       return Perfil.values();
}

   private SelectItem[] criarOpcoesFiltro(String[] data)  {  
       SelectItem[] opcoes = new SelectItem[data.length ];
  //SelectItem[] opcoes = new SelectItem[data.length];

      // opcoes[0] = new SelectItem("", "Selecione");  
       for(int i = 0; i < data.length; i++) {  
               opcoes[i] = new SelectItem(data[i], data[i]);  
       }  
       return opcoes;
   }
public Perfil getPerfil() {
return perfil;
}

public void setPerfil(Perfil perfil) {
this.perfil = perfil;
}
public void reset() {
this.user = new User();
}

public List<User> getUserList() {
userList = new ArrayList<User>();
userList.addAll(getUserService().getUsers());
return userList;
}

public IUserService getUserService() {
return userService;
}

public void setUserService(IUserService userService) {
this.userService = userService;
}
}
################## JSF ###############
<h:outputText value="Perfil: " />
<p:selectManyCheckbox value="#{userMB.user.perfil}"
	layout="pageDirection">
	<f:selectItems value="#{userMB.opcaoPerfis}"/> 
</p:selectManyCheckbox>
<h:outputText></h:outputText>

Desde já, agradeço!

8 Respostas

Hebert_Coelho

Nao coloque esse monte de código mano, fica difícil de ler.

Qual é a mensagem de erro?

C

ERRO:
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Enum

Alterei o Enum e adicionei um conversor Generico de Enum

public enum Perfil {

ADMINISTRADOR("ADMINISTRADOR"), CADASTRADOR("CADASTRADOR"), RH("RH"), SUPERINTENDENTE("SUPERINTENDENTE"), COORDENADOR("COORDENADOR"), SUPORTE("SUPORTE");


private String perfil;

Perfil(String perfil) {
this.perfil = perfil;
}

public String getEstado() {
return perfil;
}

@Override
public String toString() {
return perfil;
}

Obrigado

Hebert_Coelho

Agora ficou beeeem mais fácil.

  1. Enum não precisa de converter em JSF
  2. Em algum lugar você está enviando String para Enum. Aponte da página do JSF diretamente para o Enum que funcionará.
C

Então vou ter q criar um lista no meu enum p/exibir no JSF?

public static List<Perfil> getPerfils() {
	        List<Perfil> perfis = new ArrayList<Perfil>();
	        perfis.add(Perfil.ADMINISTRADOR);
	        perfis.add(Perfil.CADASTRADOR);
	        perfis.add(Perfil.COORDENADOR);
	        perfis.add(Perfil.RH);
	        perfis.add(Perfil.SUPERINTENDENTE);
	        perfis.add(Perfil.SUPORTE);
	        return perfis;
	    }
Hebert_Coelho

Sim.

Você pode fazer algo do tipo estados = new ArrayList<Estado>(); estados.addAll(Arrays.asList(Estado.values()));

C

Obrigado Hebert, vou testar mais tarde e te falo!!

C

Criei a lista de Enum mas não resolveu! Continuou o erro : java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Enum

private SelectItem[] criarOpcoesFiltro() {
             SelectItem[] opcoes = new SelectItem[Perfil.values().length];

		int i = 0;  
		for (Perfil tipo : Perfil.values()) {
			opcoes[i++] = new SelectItem(tipo, tipo.name());
		}
		return opcoes;
	}

O que pode ser?

C

Funcionou!! Obrigadão!! :D

Como ficou!

private List<String> selecaoPerfis;  
   private List<SelectItem> opcaoPerfis;  
  
  
 //criei a lista de opções do Enum para persistir  
   private List<SelectItem> criarOpcoesFiltro() {  
      List<SelectItem> opcoes = new ArrayList<SelectItem>();  
  
      for (Perfil tipo : Perfil.values()) {  
         opcoes.add(new SelectItem(tipo, tipo.name()));  
      }  
      return opcoes;  
   }  
  
// no metodo para adicionar o usuario no MB   
  
        addUser() {   
            selecaoToPerfilEnum(this.user);  
  
//metodo para converter String p/Enum  
private void selecaoToPerfilEnum(User usuario){        
      List<Perfil> perfis = new LinkedList<Perfil>();  
      for(int i = 0; i < selecaoPerfis.size(); i++) {  
         perfis.add(Perfil.valueOf(selecaoPerfis.get(i)));  
      }  
      usuario.setPerfis(perfis);  
   }
Criado 9 de novembro de 2012
Ultima resposta 15 de nov. de 2012
Respostas 8
Participantes 2