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

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:

[code]<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>[/code]

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

sim, vc precisa criar um custon converter

eu fiz um mas não rolou:

[code]@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();
}

}
[/code]

no selectonemenu coloquei converter=“stringer”

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

t+

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:

cara, tente assim

@FacesConverter("stringer") 

ao invez

@FacesConverter(value = "stringer") 

t+

já fiz isso, dá no mesmo.

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;  
  } 

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+

[quote=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; } [/quote]

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

alisson: continua sem funcionar tb.

tem algo errado…

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

xhtml:

[code]

<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>




<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>




<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” />


<p:commandButton action=”#{chamadoBean.salvar}" value=“Abrir Chamado” />
</h:form>

</ui:define>

</ui:composition>

[/code]

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();
	}

}

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+

[quote=caematos][quote=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; } [/quote]

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

alisson: continua sem funcionar tb.

tem algo errado…[/quote]

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í.

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

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

t+

[quote=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[/quote]

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.

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?

[quote=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?[/quote]

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

não existe esse conversor aqui

bahhhhhhhhhhh não sei mais oq fazer;