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.
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:[code]@ViewScoped
@ManagedBean
public class MeuBean {
public Area[] getAreas(){
return Area.values();
}
}[/code]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
Valeu vou tentar implementar igual o link do stackoverflow, e coloco aqui caso funcione.
Até mais.
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?
Não sei
Qual é o problema na verdade. O que aconteceu?
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??
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.
[quote=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.[/quote]
Não lança nenhuma exceção, a tela carrega normalmente, apenas o selectOneMenu que não carrega o enum.
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?