1
resposta

Validation Error: Value is not valid

Segui todo o vídeo, sobrescrevi o equals e gerei o HashCode pelo eclipse, porém a mensagem para os valores da lista ainda é a mesma: Validation Error: Value is not valid.

Minha Classe Autor está assim:

package br.com.casadocodigo.loja.models;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Autor {
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id; 
    private String nome;

    public Autor(){

    }

    public Autor(Integer id) {
        this.id = id;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Autor other = (Autor) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        return true;
    }



}

Meu formulário:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core">
<!-- <h:messages /> -->
<h:form>
    <div>
        <h:outputLabel value="Título" />
        <h:inputText value="#{adminLivrosBean.livro.titulo}" required="true" id="titulo"/>
        <h:message for="titulo"/>    
    </div>
    <div>
        <h:outputLabel value="Descrição" />
        <h:inputTextarea rows="4" cols="20"
            value="#{adminLivrosBean.livro.descricao}" required="true" id="descricao" />
        <h:message for="descricao" />
    </div>
    <div>
        <h:outputLabel value="Número de páginas" />
<!--         requiredMessage="Deve ter o número mínimo de 80 páginas" -->
        <h:inputText value="#{adminLivrosBean.livro.numeroPaginas}"
            required="true" id="numeroPaginas">
        </h:inputText>
        <h:message for="numeroPaginas" />
<!--         <f:validateLongRange minimum="80" /> -->

    </div>
    <div>
        <h:outputLabel value="Preço" />
<!--         requiredMessage="O valor deve estar entre 1.99 e 500" -->
        <h:inputText value="#{adminLivrosBean.livro.preco}" required="true" id="preco">
<!--         <f:validateDoubleRange minimum="1.99" maximum="500" /> -->
        </h:inputText>
        <h:message for="preco" />

    </div>
    <div>
        <h:outputLabel value="Autores" />
        <!--Preenche a lista com valores, trazendo os valores de getAutores -->
        <!--Coloca os valores para trabalhar em uma variável -->
        <h:selectManyListbox value="#{adminLivrosBean.livro.autores}" 
            converter= "autorConverter"  id="autores">
            <f:selectItems value="#{adminLivrosBean.autores}" 
            var="autor"
            itemValue="#{autor}" itemLabel="#{autor.nome}" />
        </h:selectManyListbox>
        <h:message for="autores" />
    </div>
    <div>
        <h:outputLabel value="Data de Publicação" />
        <h:inputText value="#{adminLivrosBean.livro.dataPublicacao}" required="true" id="dataPublicacao">
        </h:inputText>
        <h:message for="dataPublicacao" showDetail="true"/>
    </div>

    <div>
        <h:commandButton value="Cadastrar" action="#{adminLivrosBean.salvar}" />
    </div>

</h:form>


</html>

E o conversor:

package br.com.casadocodigo.loja.converters;

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

import br.com.casadocodigo.loja.models.Autor;

@FacesConverter("autorConverter")
public class AutorConverter implements Converter{


    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String id) {
        if(id != null || id.trim().isEmpty()) return null;

        System.out.println("Convertendo para Objeto: " + id);

        Autor autor = new Autor();
        autor.setId(Integer.valueOf(id));
        return autor;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object autorObject) {
        if(autorObject != null) return null;
        System.out.println("Convertendo para String: " + autorObject);
        Autor autor = (Autor) autorObject;
        return autor.getId().toString();

    }

}

Alguém teria alguma ideia do que está errado?

1 resposta

Oi tudo bem? Verifica o que você está recebendo em Id. Acredito que este não seja um valor numérico. Também verifica esse conversor, ele está um pouquinho estranho.

Precisando, poste aí.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software