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?