Enum e selectOneMenu

8 respostas
douglas_arantes

Olá pessoal, estou desenvolvendo um projeto de estudo JSF (primefaces) + JPA, + etc.

Uma livraria, que possui uma classe Livro que entre seus atributos possui:

private Area area; (Administração, Direito, Informática, etc)

E tenho um LivroBean, e uma tela de cadastro de livro, onde quero colocar um selectOneMenu que ira listar as áreas que um livro pode pertencer.

Alguém pode indicar a maneira mais comum de iterar sobre esse Enum?

Agradeço desde já, até mais.

8 Respostas

Rodrigo_Sasaki
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:
<h:selectOneMenu id="areas" value="#{meuBean.areaSelecionada}">
    <f:selectItems value="#{meuBean.areas}"/>
</h:selectOneMenu>
E ele deve funcionar, e do lado do ManagedBean, você simplesmente retorna o array de valores:
@ViewScoped
@ManagedBean
public class MeuBean {

    public Area[] getAreas(){
        return Area.values();
    }

}
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.

Para uma resposta bem mais completa, pode consultar essa aqui: http://stackoverflow.com/questions/8229638/how-to-make-a-dropdown-menu-of-a-enum-in-jsf

douglas_arantes

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.

Vou colar aqui meu código.

Enum:

package com.app.library.entities;


public enum Area {

	ADMINISTRACAO("Adiministracao"), 
	DIREITO("Direito"), 
	ECONOMIA("Economia"), 
	ENGENHARIA("Engenharia"), 
	INFORMATICA("Informatica"), 
	MEDICINA("Medicina"), 
	PSICOLOGIA("Psicologia");

	private String label;

	Area(String label){
		this.label = label;
	}

	public String getLabel(){
		return label;
	}
}

Livro:

package com.app.library.entities;

import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name="livro")
@NamedQuery(name = Livro.LISTAR_TODOS, query="SELECT l FROM Livro l")
public class Livro {
	
	public static final String LISTAR_TODOS = "Livro.listarTodos";
	
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private Integer id;
	
	@Column(unique = true)
	private Integer ISBN;
	@Column(length = 50)
	private String titulo;
	@Enumerated(EnumType.STRING)
	private Area area;
	
	@ManyToOne(cascade = CascadeType.ALL)
	private Editora editora;
	
	@Temporal(TemporalType.DATE)
	private Date ano;
	
	@ManyToOne(cascade = CascadeType.ALL)
	private Autor autor;

	public Livro(){}
	

	public Integer getId(){
		return id;
	}
	public Integer getISBN() {
		return ISBN;
	}
	public void setISBN(Integer ISBN){
		this.ISBN = ISBN;
	}
	public Area getArea() {
		return area;
	}
	public void setArea(Area area) {
		this.area = area;
	}
	public String getTitulo() {
		return titulo;
	}
	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}
	public Editora getEditora() {
		return editora;
	}
	public void setEditora(Editora editora) {
		this.editora = editora;
	}
	public Date getAno() {
		return ano;
	}
	public void setAno(Date ano) {
		this.ano = ano;
	}
	
	public Autor getAutor() {
		return autor;
	}


	public void setAutor(Autor autor) {
		this.autor = autor;
	}
	
	@Override
	public String toString() {		
		StringBuilder builder = new StringBuilder();
		builder.append("Livro [titulo=");
		builder.append(titulo);
		builder.append(", area=");
		builder.append(area.getLabel());
		builder.append(", ano=");
		builder.append(ano);
		builder.append("]");
		return builder.toString();
	}
}

LivroBean

package com.app.library.controller;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ViewScoped;
import javax.inject.Named;
import javax.persistence.EntityManager;

import com.app.library.entities.Area;
import com.app.library.entities.Livro;
import com.app.library.repositories.LivroRepository;

@Named
@ViewScoped
public class LivroBean {


	private EntityManager em;
	private LivroRepository repo;
	private Livro livro;
	private List<Livro> livros;
	
	
	@PostConstruct
	public void init(){
		livro = new Livro();
		repo = new LivroRepository(em);
		livros = new ArrayList<Livro>();
	}

	public LivroBean() {
	}

	public void salvar(Livro livro){
		repo.adicionar(livro);
		this.livros = null;
	}

	public void excluir(Livro livro){
		repo.excluir(livro);
		this.livros = null;
	}

	public void atualizar(Livro livro){
		repo.atualizar(livro);
	}

	public List<Livro> listarTodos(){
		return repo.listarTodos();
	}

	public Livro getLivro() {
		return livro;
	}

	public void setLivro(Livro livro) {
		this.livro = livro;
	}

	public LivroRepository getRepo() {
		return repo;
	}

	public List<Livro> getLivros() {
		return livros;
	}
	
	/*Aqui método que acesso no selectOneMenu*/
	public Area[] getAreas(){
		return Area.values();
	}
}

CadastroLivro.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition template="/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:define name="titulo">Sistema Biblioteca - Cadastro Livro</ui:define>

	<ui:define name="corpo">
		<h:form id="form">
			<p:panel id="panel" header="Novo Livro" style="margin-bottom:10px;">
				<h:panelGrid columns="2">

					<h:outputLabel for="isbn" value="ISBN" />
					<p:inputText id="isbn" value="#{livroBean.livro.ISBN}"
						required="true">
						<f:validateLength minimum="2" />
					</p:inputText>

					<h:outputLabel for="titulo" value="Título" />
					<p:inputText id="titulo" value="#{livroBean.livro.titulo}"
						required="true" />
				
					<h:outputLabel for="dt_lanc" value="Data de Lançamento" />
					<p:calendar id="dt_lanc" value="#{livroBean.livro.ano}"/>
				
					<h:outputLabel value="Area" />
					<p:selectOneMenu value="#{livroBean.livro.area}">
						<f:selectItem itemLabel="Selecione" />
						<f:selectItems value="#{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 :slight_smile: 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.

Alguém sabe porque isso ocorre?

Criado 20 de junho de 2013
Ultima resposta 21 de jun. de 2013
Respostas 8
Participantes 2