Pessoal, sou iniciante em JSF e comecei a utilizar o Primefaces, estou desenvolvendo um projeto mínimo(locadora) para ver como funciona.
Porém, encontrei a primeira barreira ao tentar puxar os dados de tipo de filme para um combobox de cadastro de filmes.
No caso, eu cadastro o tipo(Lançamento, Catálogo) e devo te-los no combobox do filme, porém, o combobox gerado pelo Primefaces "não abre",
embora eu consiga ver que as opções forma geradas por meio do firebug. O mesmo combobox funciona se eu utilizar as tags de html do jsf,
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<ui:composition template="template/template.xhtml">
<ui:define name="conteudo">
<h:form id="formulario">
Título:<br/><p:inputText value="#{filmeBack.filme.titulo}"/><br/>
Ano:<br/><p:inputText value="#{filmeBack.filme.ano}"/><br/>
Diretor:<br/><p:inputText value="#{filmeBack.filme.diretor}"/><br/>
Tipo:<br/>
<p:selectOneMenu value="#{filmeBack.filme.tipoFilme}" effect="fade" converter="FilmeConverter">
<f:selectItems value="#{filmeBack.tipos}" var="item" itemLabel="#{item.tipo}" itemValue="#{item}" />
</p:selectOneMenu>
<br />
<p:commandButton value="Salvar" update="formulario, :tabela" action="#{filmeBack.cadastrar}"/>
</h:form>
<h:form id="tabela">
<p:dataTable value="#{filmeBack.filmes}" var="item">
<p:column>
<f:facet name="header">Título</f:facet>
#{item.titulo}
</p:column>
<p:column>
<f:facet name="header">Ano</f:facet>
#{item.ano}
</p:column>
<p:column>
<f:facet name="header">Diretor</f:facet>
#{item.diretor}
</p:column>
<p:column>
<f:facet name="header">Tipo</f:facet>
#{item.tipoFilme.tipo}
</p:column>
<p:column>
<f:facet name="header">Preço</f:facet>
#{item.tipoFilme.preco}
</p:column>
<p:column>
<p:commandLink update=":formulario">
<f:setPropertyActionListener target="#{filmeBack.filme}" value="#{item}"/>
Alterar
</p:commandLink>
</p:column>
<p:column>
<p:commandLink action="#{filmeBack.excluir}" update=":tabela">
<f:setPropertyActionListener target="#{filmeBack.filme}" value="#{item}"/>
Excluir
</p:commandLink>
</p:column>
</p:dataTable>
</h:form>
</ui:define>
</ui:composition>
</html>
package com.nilemar.view.back;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import com.nilemar.core.bo.FilmeBO;
import com.nilemar.core.bo.TipoFilmeBO;
import com.nilemar.core.entity.FilmeEntity;
import com.nilemar.core.entity.TipoFilmeEntity;
@ManagedBean(name = "filmeBack")
@ApplicationScoped
public class FilmeBack {
private FilmeEntity filme;
private List<FilmeEntity> filmes;
private List<TipoFilmeEntity> tipos;
@PostConstruct
public void inicializar(){
filme = new FilmeEntity();
filmes = new FilmeBO().listarTodos(FilmeEntity.class);
tipos = new TipoFilmeBO().listarTodos(TipoFilmeEntity.class);
}
public void cadastrar(){
if(filme != null && filme.getId() == null){
new FilmeBO().cadastrar(filme);
}else{
new FilmeBO().alterar(filme);
}
filme = new FilmeEntity();
filmes = new FilmeBO().listarTodos(FilmeEntity.class);
}
public void excluir(){
new FilmeBO().remover(filme);
filme = new FilmeEntity();
filmes = new FilmeBO().listarTodos(FilmeEntity.class);
}
public FilmeEntity getFilme() {
return filme;
}
public void setFilme(FilmeEntity filme) {
this.filme = filme;
}
public List<FilmeEntity> getFilmes() {
return filmes;
}
public void setFilmes(List<FilmeEntity> filmes) {
this.filmes = filmes;
}
public List<TipoFilmeEntity> getTipos() {
return tipos;
}
public void setTipos(List<TipoFilmeEntity> tipos) {
this.tipos = tipos;
}
}
package com.nilemar.core.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name = "filme")
public class FilmeEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
@Column(name = "titulo")
private String titulo;
@Column(name = "ano")
private String ano;
@Column(name = "diretor")
private String diretor;
@ManyToOne
@JoinColumn(name = "id_tipo_filme", referencedColumnName = "id")
private TipoFilmeEntity tipoFilme;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
FilmeEntity other = (FilmeEntity) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTitulo() {
return titulo;
}
public void setTitulo(String titulo) {
this.titulo = titulo;
}
public String getAno() {
return ano;
}
public void setAno(String ano) {
this.ano = ano;
}
public String getDiretor() {
return diretor;
}
public void setDiretor(String diretor) {
this.diretor = diretor;
}
public TipoFilmeEntity getTipoFilme() {
return tipoFilme;
}
public void setTipoFilme(TipoFilmeEntity tipoFilme) {
this.tipoFilme = tipoFilme;
}
}
package com.nilemar.view.converter;
import javax.faces.bean.RequestScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import com.nilemar.core.bo.TipoFilmeBO;
import com.nilemar.core.entity.TipoFilmeEntity;
@RequestScoped
@FacesConverter(value = "FilmeConverter")
public class FilmeConverter implements Converter{
@Override
public Object getAsObject(FacesContext context, UIComponent component, String valor) {
if(valor != null){
return new TipoFilmeBO().buscarPorId(TipoFilmeEntity.class, Long.parseLong(valor));
}
return null;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object valor) {
if(valor != null){
return ""+((TipoFilmeEntity)valor).getId();
}
return null;
}
}
Alguém poderia me ajudar? Se é um bug do Primefaces ou se estou errando algo?
Creio estar errando algo, pois tenho um outro projeto que o selectOneMenu funciona normalmente :S