[RESOLVIDO] - JSF - select one menu: Erro de validação: o valor não é válido

28 respostas
C

Buenas!
Há algo errado ? não sei pq ele não aceita...
se eu uso o p:commandButton do primefaces ele funciona, mas nao redireciona a página
se eu uso o converter javax.converter.character ele funciona, mas só pega a primeira letra, claro;
preciso fazer algum custom converter?
:?:

xhtml:
<p:selectOneMenu id="tipo" value="#{chamadoBean.chamado.tipoChamado}"
				effect="drop" style="width:180px">
				<f:selectItem itemLabel="Tipo de Chamado" />
				<f:selectItems value="#{chamadoBean.tipoChamado}" var="tipo"
					itemValue="#{tipo}" itemLabel="#{tipo}" />
					
			</p:selectOneMenu>
bean:
public List<String> getTipoChamado() {
		if (this.tipoChamado == null) {
			this.tipoChamado = new ArrayList<String>();
			this.tipoChamado.add("Reclamação");
			this.tipoChamado.add("Sugestão");
		}
		return tipoChamado;
	}
botao:
<h:commandButton action="#{chamadoBean.salvar}" value="Abrir Chamado" />

erro:
chamado:tipo: Erro de validação: o valor não é válido

28 Respostas

A

sim, vc precisa criar um custon converter

C
eu fiz um mas não rolou:
@FacesConverter(value = "stringer")
public class StringerConverter implements Converter {

	@Override
	public Object getAsObject(FacesContext context, UIComponent component,
			String value) {
		if (value == null || value.length() == 0) {
			return null;
		}
		return value;
	}

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

}

no selectonemenu coloquei converter="stringer"

A

segue um exemplo, http://www.mkyong.com/jsf2/custom-converter-in-jsf-2-0/

t+

C

já tinha visto esse post
segue sem funfar. não sei qual o problema

não sei nem se tem como fazer isso q eu fiz
um arraylist de string pra um selectonemenu
:confused:

A

cara, tente assim

@FacesConverter("stringer")

ao invez

@FacesConverter(value = "stringer")

t+

C

já fiz isso, dá no mesmo.

N

Assim não funciona?

public List<SelectItem> getTipoChamado() {  
        if (this.tipoChamado == null) {  
            this.tipoChamado = new ArrayList<SelectItem>();  
            this.tipoChamado.add(new SelectItem("Reclamação", "Reclamação"));  
            this.tipoChamado.add(new SelectItem("Sugestão", "Sugestão"));  
        }  
    return tipoChamado;  
  }
A

cara,

tira essa anotação e coloca desse jeito no faces-config.xml

<converter>
  <converter-id>clienteConverter</converter-id>
  <converter-class>br.com.util.converter.ClienteConverter</converter-class>
 </converter>

t+

C

nazgulzurak:
Assim não funciona?

public List<SelectItem> getTipoChamado() { if (this.tipoChamado == null) { this.tipoChamado = new ArrayList<SelectItem>(); this.tipoChamado.add(new SelectItem("Reclamação", "Reclamação")); this.tipoChamado.add(new SelectItem("Sugestão", "Sugestão")); } return tipoChamado; }

não: javax.faces.model.SelectItem cannot be cast to java.lang.String

alisson: continua sem funcionar tb.

tem algo errado…

A

cara,

estranho de mais viu, pq tenho um projeto aqui e faço igualzinho eu te passei e funciona perfeito.
posta seu xhtml e converter

C
xhtml:
<!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.prime.com.tr/ui">

<ui:composition template="/templates/interna.xhtml">
	<ui:define name="titulo">
	    Abrir Chamado
	</ui:define>
	<ui:define name="corpo">
		<h:form id="chamado">
			<h:inputHidden value="#{chamadoBean.chamado.codChamado}" />
			<h:messages />
			<p:selectOneMenu id="para"
				value="#{chamadoBean.chamado.usuarioRecebeuChamado}" effect="drop"
				style="width:180px">
				<f:selectItem itemLabel="Usuário Responsável" />
				<f:selectItems value="#{usuarioBean.lista}" var="usuario"
					itemValue="#{usuario}" itemLabel="#{usuario.nome}" />
			</p:selectOneMenu>
			<br />
			<br />
			<p:selectOneMenu id="tipo" value="#{chamadoBean.chamado.tipoChamado}"
				effect="drop" style="width:180px" >
				<f:selectItem itemLabel="Tipo de Chamado" />
				<f:selectItems value="#{chamadoBean.tipoChamado}" var="tipo"
					itemValue="#{tipo}" itemLabel="#{tipo}" />
			</p:selectOneMenu>
			<br />
			<br />
			<h:outputText value="Descrição"></h:outputText>
			<p:editor value="#{chamadoBean.chamado.descricao}"
				controls="bold italic underline strikethrough | font size style | color highlight | bullets numbering | outdent indent | alignleft center alignright justify | rule link unlink | "
				width="500" height="200" required="true" />
			<br />
			<p:commandButton action="#{chamadoBean.salvar}" value="Abrir Chamado" />
		</h:form>

	</ui:define>
</ui:composition>
</html>
converter:
package webchamado.web.converter;

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


public class StringerConverter implements Converter {

	@Override
	public Object getAsObject(FacesContext context, UIComponent component,
			String value) {
		if (value == null || value.length() == 0) {
			return null;
		}
		return value;
	}

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

}
A

cara,
no seu combobox vc fez o seguinte?

<p:selectOneMenu id="tipo" value="#{chamadoBean.chamado.tipoChamado}"  
                effect="drop" style="width:180px" converter="StringerConverter">  
                <f:selectItem itemLabel="Tipo de Chamado" />  
                <f:selectItems value="#{chamadoBean.tipoChamado}" var="tipo"  
                    itemValue="#{tipo}" itemLabel="#{tipo}" />  
            </p:selectOneMenu>
package webchamado.web.converter;  
  
import javax.faces.component.UIComponent;  
import javax.faces.context.FacesContext;  
import javax.faces.convert.Converter;  
import javax.faces.convert.FacesConverter;  
  
@FacesConverter("StringerConverter")  
public class StringerConverter implements Converter {  
  
    @Override  
    public Object getAsObject(FacesContext context, UIComponent component,  
            String value) {  
        if (value == null || value.length() == 0) {  
            return null;  
        }  
        return value;  
    }  
  
    @Override  
    public String getAsString(FacesContext context, UIComponent component,  
            Object value) {  
        if (value == null) {  
            return "";  
        }  
        return value.toString();  
    }  
  
}

t+

N

caematos:
nazgulzurak:
Assim não funciona?

public List<SelectItem> getTipoChamado() { if (this.tipoChamado == null) { this.tipoChamado = new ArrayList<SelectItem>(); this.tipoChamado.add(new SelectItem("Reclamação", "Reclamação")); this.tipoChamado.add(new SelectItem("Sugestão", "Sugestão")); } return tipoChamado; }

não: javax.faces.model.SelectItem cannot be cast to java.lang.String

alisson: continua sem funcionar tb.

tem algo errado…

Estranho cara, aqui eu faço assim e funciona na boa, apesar que eu não mencionei, mas no meu xhtml eu faço assim:

<p:selectOneMenu id="tipo" value="#{chamadoBean.chamado.tipoChamado}"    
                    effect="drop" style="width:180px" converter="StringerConverter">    
                    <f:selectItem itemLabel="Tipo de Chamado" />    
                    <f:selectItems value="#{chamadoBean.tipoChamado}"/>    
                </p:selectOneMenu>

Eu não declaro a var no f:selectItem pra depois chamar no itemLabel e itemValue, deixo isso pro List, e é claro, não uso o converter daí.

C

vc faz com List ou List como eu ?

agradeço muito por estar me ajudando, apesar de ser um problema bobo e esse forum ter tanta gente, vc é o único que está tentando me ajudar :slight_smile:
valeu

A

cara,
so usar List que vai funcionar, alias teria q funcionar.rs

t+

N

caematos:
vc faz com List ou List como eu ?

agradeço muito por estar me ajudando, apesar de ser um problema bobo e esse forum ter tanta gente, vc é o único que está tentando me ajudar :slight_smile:
valeu

Eu uso o List mesmo. Por exemplo:

No bean:

public class Bean {
     private String recebeValor;
     private List<SelectItem> lista;


     //metodos

    public List<SelectItem> getLista(){
         if(lista.isEmpty){
             lista = new ArrayList<SelectItem>();
             lista.add(new SelectItem("Sugestao", "Sugestão"); //O primeiro valor do SelectItem é o itemValue e o segundo o itemLabel
         }
         return lista;
   }

}

No xhtml:

<p:selectOneMenu value="#{bean.recebeValor}">
        <f:selectItem itemLabel="Selecione..." itemValue=""/>
        <f:selectItems value="#{bean.lista}"/>
   </p:selectOneMenu>

Com isso, assim que você passa a lista pro f:selectItems, ele já popula com cada valor no seu lugar.

E

com o p:commandButton do primefaces você precisa setar o ajax=“false” para redirecionar a página (pode também update=“id do objeto” para atualizar por ajax)

Com o converter, acho que precisa do javax.faces.converter.String, não o character.

Qual o tipo do value="#{chamadoBean.chamado.tipoChamado}" ? String? não faz nenhuma operação no setTipoChamado?

C

evefuji:
com o p:commandButton do primefaces você precisa setar o ajax=“false” para redirecionar a página (pode também update=“id do objeto” para atualizar por ajax)

Com o converter, acho que precisa do javax.faces.converter.String, não o character.

Qual o tipo do value="#{chamadoBean.chamado.tipoChamado}" ? String? não faz nenhuma operação no setTipoChamado?

setando ajax=“false” dá o erro, como eu falei no 1o post.

não existe esse conversor aqui

C

bahhhhhhhhhhh não sei mais oq fazer;

N

Cara, explica certinho o que vc tá tentando fazer com esse selecOneMenu e o que sua aplicação tá querendo fazer.

C

simples: quero colocar no bean todos os tipos de chamados que podem ser escolhidos no menu. Não tem uma classe TipoChamado, e sim um atributo do tipo String em Chamado, tipoChamado onde ele vai pegar o valor escolhido no selectonemenu e salvar lá.

C
<h:selectOneMenu id="tipo" value="#{chamadoBean.chamado.tipoChamado}"
				effect="drop" style="width:180px" >
				
				<f:selectItem itemValue="Tipo de Chamado:"/>
				<f:selectItem itemValue="Sugestão"/>
				<f:selectItem itemValue="Reclamação"/>
			</h:selectOneMenu>

até assim tá dando o erro ! AAAAAAAAAA

C

não acredito nisso!!!
descobri o problema
tinha que colocar isso no início do xml:

<?xml version="1.0" encoding="ISO-8859-1" ?>

descobri quando eu selecionei uma opção que não tinha acentos e funcionou.
era culpa do encoding! :smiley:

obrigado quem tentou me ajudar! fica a dica.

A

Olha, tive o mesmo problema, o jeito que consegui resolver isso foi em vez de recuperar o objeto, eu recuperei o id.

Eu postei o código aqui: http://www.guj.com.br/java/256636-problemas-com-primefaces-e-jsf-20#1336673

Acho que vai ajudar.

M

caracas que mentira, meu tmb tava dando esse pau

maldito encoding

<?xml version="1.0" encoding="ISO-8859-1" ?>
C

Opá Pessoal,

O Meu resolveu somente para o firefox 14, mas para o IE 8 e 9 continua o mesmo problema. Alguma ideia ?

Grato.

S

pessoal.

sei que esse post é antigo, mas tive o mesmo problema, a causa era o fato de eu ter copiado os metodos equals e hashcode de outra classe. O metodo hashcode não pode ter a formula igual dentro de uma mesma aplicação.

Os metodos equals e hashcode devem ser gerados pela IDE, e não copiados de outra classe.

Att:
José Luiz

M

Siesler, obrigado pelo comentário, meu problema era semelhante ao seu, marquei bobeira e esqueci de gerar o equals na pressa e estava apanhando aqui… e pensando “meu deus, o que pode estar havendo” heheeh

Muito obrigado pelo post.

Um abraço.

siesler:
pessoal.

sei que esse post é antigo, mas tive o mesmo problema, a causa era o fato de eu ter copiado os metodos equals e hashcode de outra classe. O metodo hashcode não pode ter a formula igual dentro de uma mesma aplicação.

Os metodos equals e hashcode devem ser gerados pela IDE, e não copiados de outra classe.

Att:
José Luiz

Criado 24 de outubro de 2011
Ultima resposta 23 de jun. de 2013
Respostas 28
Participantes 9