O JSF tem um conversor padrão para enums, então você não precisa implementar o seu próprio, o que facilita muito as coisas. No caso você pode simplesmente fazer assim:
E se quiser customizar o que aparece na tela, você pode jogar isso pro próprio Enum, criando um método getDescricao que retorna o label que você quer exibir. E usando as propriedades itemValue e itemLabel do seu selectOneMenu.
Valeu vou tentar implementar igual o link do stackoverflow, e coloco aqui caso funcione.
Até mais.
douglas_arantes
Tentei seguir o que foi indicado no livro mas não funcionou.
Ele renderiza apenas o <f:selectItem itemLabel=“Selecione” />, e não lista os selectItems referentes ao enum.
packagecom.app.library.entities;importjava.util.Date;importjavax.persistence.CascadeType;importjavax.persistence.Column;importjavax.persistence.Entity;importjavax.persistence.EnumType;importjavax.persistence.Enumerated;importjavax.persistence.GeneratedValue;importjavax.persistence.GenerationType;importjavax.persistence.Id;importjavax.persistence.ManyToOne;importjavax.persistence.NamedQuery;importjavax.persistence.Table;importjavax.persistence.Temporal;importjavax.persistence.TemporalType;@Entity@Table(name="livro")@NamedQuery(name=Livro.LISTAR_TODOS,query="SELECT l FROM Livro l")publicclassLivro{publicstaticfinalStringLISTAR_TODOS="Livro.listarTodos";@Id@GeneratedValue(strategy=GenerationType.AUTO)privateIntegerid;@Column(unique=true)privateIntegerISBN;@Column(length=50)privateStringtitulo;@Enumerated(EnumType.STRING)privateAreaarea;@ManyToOne(cascade=CascadeType.ALL)privateEditoraeditora;@Temporal(TemporalType.DATE)privateDateano;@ManyToOne(cascade=CascadeType.ALL)privateAutorautor;publicLivro(){}publicIntegergetId(){returnid;}publicIntegergetISBN(){returnISBN;}publicvoidsetISBN(IntegerISBN){this.ISBN=ISBN;}publicAreagetArea(){returnarea;}publicvoidsetArea(Areaarea){this.area=area;}publicStringgetTitulo(){returntitulo;}publicvoidsetTitulo(Stringtitulo){this.titulo=titulo;}publicEditoragetEditora(){returneditora;}publicvoidsetEditora(Editoraeditora){this.editora=editora;}publicDategetAno(){returnano;}publicvoidsetAno(Dateano){this.ano=ano;}publicAutorgetAutor(){returnautor;}publicvoidsetAutor(Autorautor){this.autor=autor;}@OverridepublicStringtoString(){StringBuilderbuilder=newStringBuilder();builder.append("Livro [titulo=");builder.append(titulo);builder.append(", area=");builder.append(area.getLabel());builder.append(", ano=");builder.append(ano);builder.append("]");returnbuilder.toString();}}
LivroBean
packagecom.app.library.controller;importjava.util.ArrayList;importjava.util.List;importjavax.annotation.PostConstruct;importjavax.faces.bean.ViewScoped;importjavax.inject.Named;importjavax.persistence.EntityManager;importcom.app.library.entities.Area;importcom.app.library.entities.Livro;importcom.app.library.repositories.LivroRepository;@Named@ViewScopedpublicclassLivroBean{privateEntityManagerem;privateLivroRepositoryrepo;privateLivrolivro;privateList<Livro>livros;@PostConstructpublicvoidinit(){livro=newLivro();repo=newLivroRepository(em);livros=newArrayList<Livro>();}publicLivroBean(){}publicvoidsalvar(Livrolivro){repo.adicionar(livro);this.livros=null;}publicvoidexcluir(Livrolivro){repo.excluir(livro);this.livros=null;}publicvoidatualizar(Livrolivro){repo.atualizar(livro);}publicList<Livro>listarTodos(){returnrepo.listarTodos();}publicLivrogetLivro(){returnlivro;}publicvoidsetLivro(Livrolivro){this.livro=livro;}publicLivroRepositorygetRepo(){returnrepo;}publicList<Livro>getLivros(){returnlivros;}/*Aqui método que acesso no selectOneMenu*/publicArea[]getAreas(){returnArea.values();}}
CadastroLivro.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><ui:compositiontemplate="/WEB-INF/templates/LayoutPadrao.xhtml"xmlns="http://www.w3.org/1999/xhtml"xmlns:h="http://java.sun.com/jsf/html"xmlns:f="http://java.sun.com/jsf/core"xmlns:ui="http://java.sun.com/jsf/facelets"xmlns:p="http://primefaces.org/ui"><ui:definename="titulo">Sistema Biblioteca - Cadastro Livro</ui:define><ui:definename="corpo"><h:formid="form"><p:panelid="panel"header="Novo Livro"style="margin-bottom:10px;"><h:panelGridcolumns="2"><h:outputLabelfor="isbn"value="ISBN"/><p:inputTextid="isbn"value="#{livroBean.livro.ISBN}"required="true"><f:validateLengthminimum="2"/></p:inputText><h:outputLabelfor="titulo"value="Título"/><p:inputTextid="titulo"value="#{livroBean.livro.titulo}"required="true"/><h:outputLabelfor="dt_lanc"value="Data de Lançamento"/><p:calendarid="dt_lanc"value="#{livroBean.livro.ano}"/><h:outputLabelvalue="Area"/><p:selectOneMenuvalue="#{livroBean.livro.area}"><f:selectItemitemLabel="Selecione"/><f:selectItemsvalue="#{livroBean.areas}"var="a"itemValue="#{a}"itemLabel="#{a.label}"/></p:selectOneMenu></h:panelGrid></p:panel></h:form></ui:define></ui:composition>
Alguém tem ideia de qual o problema?
Rodrigo_Sasaki
Não sei Qual é o problema na verdade. O que aconteceu?
douglas_arantes
Então eu queria um selectOneMenu, para selecionar a área que o livro que vou cadastrar pertence, e esses valores para serem selecionados deveria vir do enum Area.
Mas essas opções (Direito, Informática, Medicina, etc) não estão sendo carregados no selectOneMenu.
Entendeu??
Rodrigo_Sasaki
Não está sendo lançada nenhuma exceção? Esse Livro está instanciado?
É a única coisa que consigo imaginar, pois fiz um teste aqui e o select foi populado normalmente.
douglas_arantes
Rodrigo Sasaki:
Não está sendo lançada nenhuma exceção? Esse Livro está instanciado?
É a única coisa que consigo imaginar, pois fiz um teste aqui e o select foi populado normalmente.
Não lança nenhuma exceção, a tela carrega normalmente, apenas o selectOneMenu que não carrega o enum.
douglas_arantes
Olá Rodrigo, consegui resolver o problema. Agora o selectOneMenu lista os valores do Enum Area.
Mas a solução foi a seguinte, troquei a anotação @Named por @ManagedBean, e funciou.