JSF SelectOneMenu - Validation Error: Value is not valid

Pessoal,

Alguém poderia me ajudar a descobrir o porquê desse erro?
j_idt7:uf: Validation Error: Value is not valid

Inicialmente o form é carregado com a lista de UFs disponíveis.
Depois seleciono uma UF e submeto o form, quando o erro ocorre.

Não usei nenhum Converter porque só preciso do idUf, não preciso carregar um objeto inteiro na combo. Tentei usar um UfConverter por desencargo, mas o erro persistiu da mesma forma (desde vez como “null Converter”).

Qualquer sugestão é bem-vinda!!

Tecnologias utilizadas:

JSF 2.0/Facelets
Tomcat 6.0.26
NetBeans 6.9.1
Java 1.6.0_21

fornecedor.xhtml:

...
<h:outputLabel value="UF" />
<h:selectOneMenu id="uf" value="#actFornecedor.mbFornecedor.mbUf.idUf}">
    <f:selectItems value="#{actFornecedor.ufsDisponiveis}" />
</h:selectOneMenu>
 
<h:commandButton  value="OK" action="#{actFornecedor.ok}" />
...

FornecedorAct.java:

@ManagedBean(name="actFornecedor")
@RequestScoped
public class FornecedorAct {

    private List<SelectItem> ufsDisponiveis;

    @ManagedProperty(value="#{mbFornecedor}")
    private FornecedorMB mbFornecedor;

    //carrega a combo UF no formulario
    public void initCadastro() {

        ufsDisponiveis = new ArrayList();

        ufsDisponiveis.add(new SelectItem("SC", "Santa Catarina");
        ufsDisponiveis.add(new SelectItem("PR", "Paraná"));
        ufsDisponiveis.add(new SelectItem("RS", "Rio Grande do Sul");
    }

    //persiste os dados preenchidos no formulario
    public String ok() {
    }

    //getters e setters omitidos
}

FornecedorMB.java:

@ManagedBean(name="mbFornecedor")
@RequestScoped
public class FornecedorMB implements Serializable {

    private String idUf;

    //getters e setters omitidos
}

Código html gerado após o form carregado:

<label>UF</label>
<select id="j_idt7:uf" name="j_idt7:uf" size="1">	
        <option value="SC">Santa Catarina</option>
	<option value="PR">Paraná</option>
	<option value="RS">Rio Grande do Sul</option>
</select>

Tenta iniciar todas as suas variáveis que estão no escopo.
Para não deixa-las nulas.
Tive um problema desse tipo e conseguir resolver assim.

Inicializei idUf="", conforme abaixo…

FornecedorMB.java:

@ManagedBean(name="mbFornecedor")
@RequestScoped
public class FornecedorMB implements Serializable {

    private String idUf;
 
    public FornecedorMB() {
        this.idUf = "";
    }

    //getters e setters omitidos
}

… mas não funcionou :frowning:

Uma coisa que não prestei atenção.
O jsf 2.0 roda na versão 7 em diante do tomcat se eu não me engano.
Ou então usa algum servidor com o padrão jee6 é o caso do glassfish 3.0 e o jboss 6

tenta colocar idUf como Integer em vez de String

Alterei de String para Integer, mas não funcionou.
Continua dando exatamente o mesmo erro :frowning:

Pessoal,

Fiz um projetinho bem simples no NetBeans, desta vez usando GlassFish 3.0.1.
Porém o erro original continua, não consigo submeter a UF selecionada na combo (Validation Error: Value is not valid).

Poderiam dar uma olhada prá mim, por favor!!

Segue o projeto NetBeans (MeuTeste.zip):
http://www.streamfile.com/myid/r8D7jwwMxCew

Qualquer dica é muito bem-vinda!!

[]'s

Teste jogar este valor num atributo qualquer, mas não dentro do objeto.

Crie uma String para teste dentro do actFornecedor

private String uf;
//get e set

Substitua isso:

&lt;h:selectOneMenu id="uf" value="#{actFornecedor.mbFornecedor.mbUf.idUf}"&gt;

Por:

&lt;h:selectOneMenu id="uf" value="#{actFornecedor.uf}"&gt;

Acredito que mbFornecedor esteja null, por isso ele não consegue setar o valor dentro dele

Outra dica…
Altere o @RequestScoped por @SessionScoped
tenho quase certeza que a lista está indo para a visualização, mas na hora de salvar, ele perde a referencia da lista por ser apenas um request

Oi Andii,
Tentei as 2 sugestões, mas sem sucesso :frowning:

Funcionou :slight_smile:

A listagem de ufs (a ser carregada na combo), deve ser carregada no construtor do “actFornecedor”.

Estava assim…

@ManagedBean(name="actFornecedor")  
@RequestScoped  
public class FornecedorAct {  
   
   private List<SelectItem> ufsDisponiveis;  
 
   @ManagedProperty(value="#{mbFornecedor}")  
   private FornecedorMB mbFornecedor;  

   //carrega a combo UF no formulario  
   private void initCadastro() {  
   
        ufsDisponiveis = new ArrayList();  
   
        ufsDisponiveis.add(new SelectItem("SC", "Santa Catarina");  
        ufsDisponiveis.add(new SelectItem("PR", "Paraná"));  
        ufsDisponiveis.add(new SelectItem("RS", "Rio Grande do Sul");  
   }  
  
   //persiste os dados preenchidos no formulario  
   public String ok() {
        return "fornecedorOK";
   }

   //dispara ao acessar a tela de cadastro.
   public String novo() {

        initCadastro();
        return "fornecedorIni";
   }

   //getters e setters omitidos  
} 

… mas deve ser assim!!

@ManagedBean(name="actFornecedor")  
@RequestScoped  
public class FornecedorAct {  
   
   private List<SelectItem> ufsDisponiveis;  
 
   @ManagedProperty(value="#{mbFornecedor}")  
   private FornecedorMB mbFornecedor;

   public FornecedorAct() {

      initCadastro(); //DEVE SER INICIALIZADO AQUI NO CONSTRUTOR
   }

   //carrega a combo UF no formulario  
   private void initCadastro() {  
   
        ufsDisponiveis = new ArrayList();  
   
        ufsDisponiveis.add(new SelectItem("SC", "Santa Catarina");  
        ufsDisponiveis.add(new SelectItem("PR", "Paraná"));  
        ufsDisponiveis.add(new SelectItem("RS", "Rio Grande do Sul");  
   }  
  
   //persiste os dados preenchidos no formulario  
   public String ok() {
        return "fornecedorOK";
   }

   //dispara ao acessar a tela de cadastro.
   public String novo() {

        //initCadastro(); //NAO DEVE ESTAR AQUI, E SIM NO CONSTRUTOR
        return "fornecedorIni";
   }

   //getters e setters omitidos  
} 

Obrigado a todos pelas sugestões.