JSF selectOneMenu Erro ao Validar!

2 respostas
M

Olá Amigos,

primeiramente, eu sei que existem diversos tópicos sobre este assunto, porém, eu segui a maioria que encontrei, tanto que já alterei esta parte da minha aplicação diversas vezes, de diversas maneiras diferentes de se fazer, mas continuo com o mesmo erro:

Que é o seguinte:
formulario:selectCliente: Erro de validação: o valor não é válido
formulario:selectProduto: Erro de validação: o valor não é válido

inclusive já implementei os métodos hashcode() e equals() para ambos os beans desses selectOneMenu.

segue abaixo alguns códigos de um dos combos e seu respectivo bean para vocês me ajudarem:

Converter:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package utils;

import bean.Cliente;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.FacesConverter;
import persistencia.dao.AbstractDAO;

/**
 *
 * @author Administrador
 */
@FacesConverter(value="ConverterCliente", forClass=Cliente.class)
public class ConverterCliente implements javax.faces.convert.Converter {

    @Override
    public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
        return new AbstractDAO().consultar("Cliente", " codigo=" + Integer.valueOf(arg2));  
    }

    @Override
    public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
        return String.valueOf(((Cliente) arg2).getCodigo());
        
    }
}

Bean:

package bean;
// Generated 30/11/2011 23:45:01 by Hibernate Tools 3.2.1.GA

import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import persistencia.dao.AbstractDAO;

/**
 * Cliente generated by hbm2java
 */
@ManagedBean
@RequestScoped
public class Cliente implements java.io.Serializable {

    private int codigo;
    private String nome;
    private String login;
    private String senha;
    private Set compras = new HashSet(0);

    public Cliente() {
    }

    public Cliente(int codigo) {
        this.codigo = codigo;
    }

    public Cliente(int codigo, String nome, String login, String senha, Set compras) {
        this.nome = nome;
        this.login = login;
        this.senha = senha;
        this.compras = compras;
    }

    public int getCodigo() {
        return this.codigo;
    }

    public void setCodigo(int codigo) {
        this.codigo = codigo;
    }

    public String getNome() {
        return this.nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getLogin() {
        return this.login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getSenha() {
        return this.senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public Set getCompras() {
        return this.compras;
    }

    public void setCompras(Set compras) {
        this.compras = compras;
    }

    public List<Cliente> getCombo() {
        return new AbstractDAO().listar("Cliente");
        
    }
    
    public List<Compra> getClientes() {
        return new AbstractDAO().listar("Cliente");
    }
    
    @Override
    public int hashCode(){
        int hash = 17;
        
        hash = 37 * hash + this.codigo;
        hash = 37 * hash + (this.nome == null ? 0 : this.nome.hashCode());
        hash = 37 * hash + (this.login == null ? 0 : this.login.hashCode());
        hash = 37 * hash + (this.senha == null ? 0 : this.senha.hashCode());
        
        
       return hash;
    }

}

Formulário:

<h:form id="formulario" >  
            <p:panel header="Cadastrar Compra">
                <p:messages />
                <table>
                    
                    <tr>
                        <td><h:outputText value="Cliente"/></td>
                        <td><h:selectOneMenu id="selectCliente" value="#{compra.cliente}" required="true" requiredMessage="Defina um cliente." >
                                <f:selectItems value="#{cliente.combo}" var="cliente" itemLabel="#{cliente.nome}" itemValue="#{cliente}"/>
                                <f:converter converterId="ConverterCliente" />
                            </h:selectOneMenu></td>
                    </tr>
                    <tr>
                        <td><h:outputText value="Produto" /></td>
                        <td><h:selectOneMenu id="selectProduto" value="#{compra.produto}" required="true" requiredMessage="Defina um produto.">
                                <f:selectItems value="#{produto.combo}" var="produto" itemLabel="#{produto.nome}" itemValue="#{produto}"/>
                                <f:converter converterId="ConverterProduto" />
                            </h:selectOneMenu>

                        </td>
                    </tr>
                    <tr>
                        <td><h:outputText value="Quantidade" /></td>
                        <td><p:inputText id="quantidade" value="#{compra.quantidade}" /></td>
                    </tr>
                    <tr>
                        <td><h:outputText value="Data" /></td>
                        <td><p:calendar  value="#{compra.data}" showOn="button"/></td>
                    </tr>
                    <tr>
                        <td><p:commandButton id="buttonCadastrar" value="Cadastrar" actionListener="#{compra.cadastrar(event)}" /></td>
                        <td><h:commandButton value="Cadastrar" actionListener="#{compra.cadastrar(event)}" /></td>
                    </tr>
                </table>
            </p:panel>


        </h:form>

2 Respostas

Hebert_Coelho
  1. HashCode no MB? O.o Você precisar de implementar esse métodos na sua classe de persistencia, não no MB.
  2. Pq implements java.io.Serializable se teu MB está como @RequestScope?
  3. Tem como você postar seu método #{compra.produto} e #{compra.cliente} ?

E mais importante, você está utilizando o Cliente como MB e classe a ser persistida? O.o

M

Olá Jakefrog, obrigado por esta me ajudando.

Primeiramente, sou iniciante em JSF, estou aprendendo na faculdade, porém o professor não ensinou nada a mais do que imprimir strings submetidas na página. Mas para o trabalho ele está querendo um CRUD que terei de entregar hoje, mas pelo jeito não vou conseguir terminar a tempo.

O HashCode é justamente para validar o objeto ao ser escolhido no SelectOneMenu, vide recomentdação:
http://www.rponte.com.br/tag/selectonemenu/page/2/

Sobre o @RequestScope, eu não sei o que significa, não sabia que influenciaria.

E sobre o método compra.alguma coisa, segue abaixo o bean Compra:

package bean;
// Generated 30/11/2011 23:45:01 by Hibernate Tools 3.2.1.GA
import java.sql.Date;
import java.text.DateFormat;
import java.util.List;
import java.util.Locale;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.event.ActionEvent;
import javax.swing.JOptionPane;
import persistencia.dao.AbstractDAO;

/**
 * Cliente generated by hbm2java
 */
@ManagedBean
@RequestScoped
public class Compra implements java.io.Serializable {

    private CompraId id;
    private Produto produto;
    private Cliente cliente;
    private Integer quantidade;
    private String data;

    public Compra() {
    }

    public Compra(Produto produto, Cliente cliente, Integer quantidade, String data) {
        this.produto = produto;
        this.cliente = cliente;
        this.quantidade = quantidade;
        this.data = data;
        this.setId(cliente, produto);

    }

    public Compra(CompraId id, Produto produto, Cliente cliente) {
        this.id = id;
        this.produto = produto;
        this.cliente = cliente;
    }

    public Compra(CompraId id, Produto produto, Cliente cliente, Integer quantidade, String data) {
        this.id = id;
        this.produto = produto;
        this.cliente = cliente;
        this.quantidade = quantidade;
        this.data = data;
    }

    public CompraId getId() {
        return this.id;
    }

    public void setId(CompraId id) {
        this.id = id;
    }

    public void setId(Cliente cliente, Produto produto) {
        int codigo = new AbstractDAO().getMaxID("Compra", "codigo");
        this.id = new CompraId(cliente.getCodigo(), produto.getCodigo(), ++codigo);
    }

    public Produto getProduto() {
        return this.produto;
    }

    public void setProduto(Produto produto) {
        this.produto = produto;
    }

    public Cliente getCliente() {
        return this.cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    public Integer getQuantidade() {
        return this.quantidade;
    }

    public void setQuantidade(Integer quantidade) {
        this.quantidade = quantidade;
    }

    public String getData() {
        return this.data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public void setDataHoje() {
        Date data = new Date(System.currentTimeMillis());
        DateFormat hoje = DateFormat.getDateInstance(DateFormat.MEDIUM, new Locale("pt", "BR"));

        this.data = hoje.format(data);
    }

    public String getDataHoje() {
        this.setDataHoje();
        return this.getData();
    }

    public List<Compra> getCompras() {
        return new AbstractDAO().listar("Compra");
    }

    public void cadastrar(ActionEvent event) {
        this.setId(cliente, produto);
        new AbstractDAO().cadastrar(this);
    }

    public void remover() {
        new AbstractDAO().excluir(this);
    }
}
Criado 5 de dezembro de 2011
Ultima resposta 5 de dez. de 2011
Respostas 2
Participantes 2