Problema com PrimeFaces selectOneMenu

11 respostas
D

Olá pessoal, seguinte, estou iniciando em JSF, estou utilizando PrimeFaces, procurei em todo o pai google, achei muitas pessoas com o mesmo problema que o meu, testei váaaaarias "soluções dadas", mas nenhuma conseguiu me salvar.

Estou tentando popular dois selectOneMenu, o primeiro é populado assim que a página é carregada, quando a pessoa escolhe uma empresa, o segundo é populado com os contatos desta empresa.

Até ai tudo bem, porem, quando clico no botão Salvar dá um erro como se o segundo selectOneMenu não tivesse valor, segue o erro:

Contato: Erro de validação: o valor não é válido

<p:panel header="Nova OS" style="text-align: left;" styleClass="tabela"> 
      <p:messages id="messages" />
        <h1><h:outputLabel value="Número: #{osBean.numeroOS}" /></h1>
     <p:panel id="panelCliente" header="Dados do Cliente" >
      	<table>
      	<tr>
      	<td>
      	<h:outputLabel value="Nome: *"/>
      	</td>
      	<td colspan="2">
      		<p:selectOneMenu value="#{osBean.idCliente}" required="true" label="Cliente">
      			<f:selectItem itemValue=""  itemLabel="Selecione"/>
      			<f:selectItems value="#{clienteBean.clientes}" var="cliente" itemLabel="#{cliente.nome}"  itemValue="#{cliente.id}"/>
      			<f:ajax event="change" render="panelCliente" listener="#{osBean.carregarCliente}"/>
      		</p:selectOneMenu>	
      	</td>
      	</tr>
      	<tr>
      	<td>
      		<h:outputLabel value="Endereço: "/>
      	</td>
      	<td colspan="2">
      		<h:outputLabel value="#{osBean.enderecoCliente}"/>
      	</td>
      	</tr>
      	<tr>
      	<td>
      		<h:outputLabel value="Complemento: "/>
      	</td>
      	<td>
      		<h:inputText value="#{osBean.complemento}" style="width:400px" rendered="#{osBean.enderecoCliente != null}"/>
      	</td>
      	</tr>
      	<tr>
      	<td>
      	<h:outputLabel value="Contato: *"/>
      	</td>
      	<td colspan="2">
      		<p:selectOneMenu value="#{osBean.idContato}" required="true" label="Contato">
      			<f:selectItem itemValue=""  itemLabel="Selecione"/>
      			<f:selectItems value="#{osBean.contatos}" var="contato" itemLabel="#{contato.nome}"  itemValue="#{contato.idContato}"/>
      		</p:selectOneMenu>
      	</td>
      	</tr>
      	</table>
      </p:panel>

     <!-- Aqui tem mais 200 linhas de outras informações -->

<p:commandButton value="Salvar" action="#{osBean.insereOS}" ajax="false"/>

Já tentei usar o "p:ajax" o "f:ajax", mas nada adianta, no bean já tentei usar Map<>, List<> e continuo sem sucesso.

Se alguém ai puder me dar uma força eu agradeço, se quiserem me add msn [email removido]

Abração e obrigado.

[img]https://public.blu.livefilestore.com/y1pR34TU7tQINyqd9EcFeqXEsSnI-ZcT5p7PPmxDwI7pcLtVKK6sjHpJW1NX_iNMWy4zv_2V3TBtNA9QzJI7FvCoA/Sem%20t%C3%ADtulo.jpg?psid=1[/img]

11 Respostas

Hebert_Coelho

Como estão os get/set dos #{osBean.idContato} e #{contato.idContato}?

marcos4ft

posta o seu bean

D
marcos4ft:
posta o seu bean

Pessoal, pra simplificar, criei um novo projeto só pra mostrar melhor o problema, segue o meu xhtml e o bean.

Dentro do bean estou usando um List de objetos, Marca e Modelo, que contem Integer id; String nome;

Quando clico no botão mando ele mostrar no SystemOut os Ids selecionados, porem, o método nem é acionado e ocorre o erro em questão.

O erro que ocorre é escrito no SystemOut assim:

06/03/2012 22:00:38 com.sun.faces.renderkit.RenderKitUtils renderUnhandledMessages
INFO: AVISO: FacesMessage(s) foram enfileirados, mas podem não ter sido exibidos.
sourceId=j_idt15:Modelos[severity=(ERROR 2), summary=(Modelo: Erro de validação: o valor não é válido), detail=(Modelo: Erro de validação: o valor não é válido)]

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!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:f="http://java.sun.com/jsf/core"
	  xmlns:h="http://java.sun.com/jsf/html"
	  xmlns:p="http://primefaces.org/ui"
	  xmlns:ui="http://java.sun.com/jsf/facelets">
	  
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Insert title here</title>
</h:head>
<h:body>

<h:form>
<p:panel id="panelTeste" header="Testando SelectOneMenu">
	
	<p:selectOneMenu id="Marcas" value="#{testeBean.idMarca}" required="true" label="Marca">
		<f:selectItem itemValue=""  itemLabel="Selecione"/>
      	<f:selectItems value="#{testeBean.marcas}" var="marca" itemLabel="#{marca.nome}"  itemValue="#{marca.id}"/>
      	<f:ajax event="change" render="panelTeste" listener="#{testeBean.populaCombo2}"/>
	</p:selectOneMenu>
	
	<p:selectOneMenu id="Modelos" value="#{testeBean.idModelo}" required="true" label="Modelo">
		<f:selectItem itemValue=""  itemLabel="Selecione"/>
      	<f:selectItems value="#{testeBean.modelos}" var="modelo" itemLabel="#{modelo.nome}"  itemValue="#{modelo.id}"/>
	</p:selectOneMenu>
	
</p:panel>

<p:commandButton value="Salvar" action="#{testeBean.mostraIDsSystemOut}" ajax="false"/>

</h:form>
</h:body>
</html>

O Bean:

package com.bean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import com.modelo.Marca;
import com.modelo.Modelo;

public class TesteBean implements Serializable{

	private static final long serialVersionUID = 123424L;

	private Integer idMarca;
	private Integer idModelo;
	private List<Marca> marcas;
	private List<Modelo> modelos;
	
	public TesteBean() {
		Marca marca1 = new Marca();
		Marca marca2 = new Marca();
		marcas = new ArrayList<Marca>();
		
		marca1.setId(1);
		marca1.setNome("Sony");
		
		marca2.setId(2);
		marca2.setNome("Mac");
		
		marcas.add(marca1);
		marcas.add(marca2);
	}
	
	public void populaCombo2(){
		if(idMarca == 1){
			Modelo modelo1 = new Modelo();
			Modelo modelo2 = new Modelo();
			modelos = new ArrayList<Modelo>();
			
			modelo1.setId(1);
			modelo1.setNome("VAIO D300");
			
			modelo2.setId(2);
			modelo2.setNome("VAIO D400");
			
			modelos.add(modelo1);
			modelos.add(modelo2);
		}
		if(idMarca == 2){
			Modelo modelo1 = new Modelo();
			Modelo modelo2 = new Modelo();
			modelos = new ArrayList<Modelo>();
			
			modelo1.setId(1);
			modelo1.setNome("BOOK PRO");
			
			modelo2.setId(2);
			modelo2.setNome("BOOK AIR");
			
			modelos.add(modelo1);
			modelos.add(modelo2);
		}
	}
	
	public void mostraIDsSystemOut(){
		System.out.println("IdMarca: "+idMarca+"   IdModelo: "+idModelo);
	}
	
	public Integer getIdMarca() {
		return idMarca;
	}

	public void setIdMarca(Integer idMarca) {
		this.idMarca = idMarca;
	}

	public Integer getIdModelo() {
		return idModelo;
	}

	public void setIdModelo(Integer idModelo) {
		this.idModelo = idModelo;
	}

	public List<Marca> getMarcas() {
		return marcas;
	}

	public void setMarcas(List<Marca> marcas) {
		this.marcas = marcas;
	}

	public List<Modelo> getModelos() {
		return modelos;
	}

	public void setModelos(List<Modelo> modelos) {
		this.modelos = modelos;
	}	
}

Muito obrigado mais uma vez.

Só lembrando que eu já alterei a linha:

por:

Dá exatamente o mesmo erro.

[img]https://public.blu.livefilestore.com/y1pjETgEdx-texJse9vNl4AxwExd2EQ7_vvjBdpusf8aqEbDpKcXNOyBi50FGUVvgUFaJDnfB0g4xvvAjfCSmEI6A/teste2.jpg?psid=1[/img]

D

Ninguém consegue me ajudar???

Hebert_Coelho

Tenta trocar de Integer para int

D

Então amigo, alterei e nada, mesmo erro. :frowning:

Hebert_Coelho

Esse cara está como request? TesteBean

D

Sim, como request.

marcos4ft

Cara, ao invé de pegar só o id, você pegar o objeto inteiro, ja tentou fazer isso?

<p:selectOneMenu id="Marcas" value="#{testeBean.marca}" required="true" label="Marca">  
        <f:selectItem itemValue=""  itemLabel="Selecione"/>  
        <f:selectItems value="#{testeBean.marcas}" var="marca" itemLabel="#{marca.nome}"  itemValue="#{marca}"/>  
        <f:ajax event="change" render="panelTeste" listener="#{testeBean.populaCombo2}"/>  
    </p:selectOneMenu>
R

Bom,se vc googleou direito com certeza viu esse link aqui:
http://www.rponte.com.br/2008/02/01/selectonemenu-converter-erro-de-validacao/

D

raf4ever:
Bom,se vc googleou direito com certeza viu esse link aqui:
http://www.rponte.com.br/2008/02/01/selectonemenu-converter-erro-de-validacao/

Olá, então, fiz como descrito, e funciona PARA UM COMBOBOX.

Criei o converter, criei as classes do converter, sobrescrevi os metodos hashcode e equals, porem, continua dando o mesmo erro.

se eu nao uso o “f:ajax” para popular o segundo combobox, ou seja, “seto” os dois de inicio, tudo funciona perfeito.

Acho que meu problema está na renderização, será???

tentei renderizar tanto o panel quanto o combobox2.

[color=red]Só ressaltando: O problema ocorre somente quando coloco a tag <f:ajax> ou <p:ajax> no combo1 para repopular o combo2[/color]

Criado 5 de março de 2012
Ultima resposta 9 de mar. de 2012
Respostas 11
Participantes 4