selectOneMenu do Primefaces não está funcionando

1 resposta
nilemarbarcelos

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,

Segue o código. Minha página de cadastro.
<!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>
Meu ManagedBean
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;
	}	
}
Minha Entidade
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;
	}
}
Meu converter
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

1 Resposta

nilemarbarcelos

Bom, foi resolvido retirando o Javascript do template, devia ter algo incompatível nele.
Fica a resolução pra quem precisar algum dia.

Criado 9 de julho de 2012
Ultima resposta 9 de jul. de 2012
Respostas 1
Participantes 1