Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Erro ao converter

Boa tarde, estou com um erro para converter aqui, mais não estou achando o erro, primeiro irei postar o meu selectOneMenu ai explico oque está acontecendo.

<p:outputLabel value="Fornecedor: " for="fornecedor" />
<p:selectOneMenu id="fornecedor" 
        value="#{produtoBean.produto.fornecedor}" filter="true"
        filterMatchMode="contains" required="true" 
        requiredMessage="O campo[FORNECEDOR] é obrigatório" 
        converter="fornecedorConverter">
    <f:selectItem itemValue="" itemLabel="Selecione um fornecedor" /> 
    <f:selectItems value="#{produtoBean.fornecedores}" 
            var="forne" itemLabel="#{forne.descricao}" 
            itemValue="#{forne}" />
</p:selectOneMenu>

Como podem ver o meu produto tem um fornecedor, porem para adicionar ele no meu selectOneMenu tive que fazer o converter, porem se vocês olharem o campo é obrigatório, mais quando eu vo no selectOneMenu e escolho um fornecedor e clico em salvar, a minha pagina xhtml acusa que o campo fornecedor é obrigatório, mais eu escolho e mesmo assim acusa isso. Irei postar meus codigos. Aqui está os metodos equal e hash da classe Fornecedor.


import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;

@SuppressWarnings("serial")
@Entity
@NamedQueries({
    @NamedQuery(name = "Fornecedor.lista", query = "Select f from Fornecedor f")
})
public class Fornecedor implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo;

    private String descricao;
    @OneToMany(mappedBy = "fornecedor")
    private List<Produto> produtos = new ArrayList<Produto>();

    public Long getCodigo() {
        return codigo;
    }
    public void setCodigo(Long codigo) {
        this.codigo = codigo;
    }
    public String getDescricao() {
        return descricao;
    }
    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }
    public List<Produto> getProdutos() {
        return produtos;
    }
    public void setProdutos(List<Produto> produtos) {
        this.produtos = produtos;
    }
    @Override
    public String toString() {
        return "Fornecedor [codigo=" + codigo + ", descricao=" + descricao + ", produtos=" + produtos + "]";
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((codigo == null) ? 0 : codigo.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;
        Fornecedor other = (Fornecedor) obj;
        if (codigo == null) {
            if (other.codigo != null)
                return false;
        } else if (!codigo.equals(other.codigo))
            return false;
        return true;
    }



}

Aqui está a minha classe de converter.

@FacesConverter("fornecedorConverter")
public class FornecedorConverter implements Converter {

@Inject
FornecedorDao dao;

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String valor) {
        try {
            Long codigo = Long.parseLong(valor);
            Fornecedor fornecedor = dao.buscarPorCodigo(codigo);
            return fornecedor;
        } catch (RuntimeException e) {
            return null;
        }
    }

    @Override
    public String getAsString(FacesContext arg0, UIComponent component, Object objeto) {
        try {
            Fornecedor fornecedor = (Fornecedor) objeto;
            Long codigo = fornecedor.getCodigo();
            return codigo.toString();
        }catch (RuntimeException e) {
            return null;
        }    

    }
}

Aparentemente está tudo ok, alguém me ajuda por favor.

3 respostas
solução!

Fala, Alisson!

O jsf 2.2 não permite a injeção de dependências em conversores. Esse problema deve ser resolvido na versão 2.3. Assim, você não conseguirá injetar o DAO no Converter.

Até lá, você pode usar a biblioteca omnifaces, que provê essa funcionalidade. Basta adicioná-la à pasta lib do teu projeto que já estará funcionando e sua injeção funcionará.

Quando sair a versão 2.3, você pode remover a biblioteca.

Link: http://central.maven.org/maven2/org/omnifaces/omnifaces/2.5.1/omnifaces-2.5.1.jar

Testa e dá um retorno.

Abraço.

Mano você é foda de mais kkk. Parece que sabe tudo pela mor kkk. muito obrigado rodou tudo perfeitamente! valeu denovooo!!! um grande abraço amigo

kkkkkkkkkkkkk. Que nada, pow... só respondi antes de outras pessoas que também sacam bastante...

Qualquer coisa, estamos aí... hehe

Abraço.

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