Erro com p:selectOneMenu

2 respostas
fer.ferreira6

Boa Tarde Galera,

Poderiam dar uma olhada nesse código abaixo?
Estou com problemas com o selectOneMenu do primefaces, antes da página aparecer, ocorre este erro:

ava.lang.ClassCastException: java.lang.String cannot be cast to javax.faces.model.SelectItem
	at org.primefaces.renderkit.InputRenderer.getSelectItems(InputRenderer.java:47)
	at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeMarkup(SelectOneMenuRenderer.java:68)
	at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeEnd(SelectOneMenuRenderer.java:62)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
	at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:312)
	at com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:185)
	at com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:129)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779)
	at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
	at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:304)
	at com.sun.faces.renderkit.html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:105)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
	at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:55)
	at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:43)
	at org.primefaces.component.layout.LayoutUnitRenderer.encodeEnd(LayoutUnitRe

Olha os códigos:

xhtml

<p:selectOneMenu id="oneMenuProjeto" value="#{pendenciaMB.projetoSelecionado}" converter="br.com.gerenciadorPendencia.web.converter.ProjetoConverter" title="Selecione o projeto a qual esta pendência pertencerá">
					<f:selectItem value="Selecione ..." itemValue=""/>
					<f:selectItems value="#{pendenciaMB.listaProjetos}" var="p" itemValue="#{p.id}" itemLabel="#{p.nome}"/>	
				</p:selectOneMenu>

ManagedBean

package br.com.gerenciadorPendencia.web.managedBean;

import java.util.List;

import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import br.com.gerenciadorPendencia.entidade.Projeto;
import br.com.gerenciadorProjeto.business.projeto.ProjetoBusinessRemote;

@ManagedBean(name = "pendenciaMB")
@ViewScoped
public class PendenciaManagedBean {
	private List<Projeto> listaProjetos;

	private Projeto projetoSelecionado;

	@EJB
	private ProjetoBusinessRemote projetoBusiness;

	public PendenciaManagedBean() {

	}

	/**
	 * @return
	 */
	public List<Projeto> getListaProjetos() {
		try {
			for (Projeto projeto : projetoBusiness.listar()) {
				listaProjetos.add(projeto);
			}
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		return listaProjetos;
	}

	public Projeto getProjetoSelecionado() {
		return projetoSelecionado;
	}

	public void setProjetoSelecionado(Projeto projetoSelecionado) {
		this.projetoSelecionado = projetoSelecionado;
	}
}

Converter

package br.com.gerenciadorPendencia.web.converter;

import javax.ejb.EJB;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;

import br.com.gerenciadorProjeto.business.projeto.ProjetoBusinessRemote;

@FacesConverter("br.com.gerenciadorPendencia.web.converter.ProjetoConverter")
public class ProjetoConverter implements Converter {
	@EJB
	private ProjetoBusinessRemote projetoBusiness;

	@Override
	public Object getAsObject(final FacesContext context, final UIComponent component, final String value) {

		try {
			return this.projetoBusiness.selecionar(Integer.parseInt(value));
		} catch (NumberFormatException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	@Override
	public String getAsString(final FacesContext context, final UIComponent component, final Object value) {
		return value.toString();
	}
}

Não acho o erro, será que seria o Converter?

Agradeço a atenção

2 Respostas

Thiago_Siqueira

Bom dia cara.

a sua lista:

private List<Projeto> listaProjetos;

Deve ser do tipo SelectItem

private List<SelectItem> listaProjetos;

Para contruí-la você passará, por item, uma key e um value, onde a key seria o id e o value o nome.
Se tiver alguma dúvida de como fazer, só falar.

Abraços

fer.ferreira6

Opa Thiago,

Acabei achando a solução, tinha até esquecido de postar aqui.

No meu caso, eu tinha:

<p:selectOneMenu id="oneMenuProjeto" value="#{pendenciaMB.projetoSelecionado}" converter="br.com.gerenciadorPendencia.web.converter.ProjetoConverter" title="Selecione o projeto a qual esta pendência pertencerá">  
                    <f:selectItem value="Selecione ..." itemValue=""/>  
                    <f:selectItems value="#{pendenciaMB.listaProjetos}" var="p" itemValue="#{p.id}" itemLabel="#{p.nome}"/>     
</p:selectOneMenu>

O que acontece, o f:SelectItem tinha como Value uma String, porém, minha Lista era de Objeto Projeto, então não tinha um Cast.
A solução:

Tirar o f:selectItem ou no Converter, colocar um if para evitar que o value de String fosse para o ManagedBean.

No meu caso, tirei o f:selectItem, pois não era algo importante.

Valeu pela ajuda Thiago.

Criado 28 de agosto de 2012
Ultima resposta 29 de ago. de 2012
Respostas 2
Participantes 2