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

Conversores erro

Bom dia, estou criando um conversor para converter o meu resultado do selectOneMenu, pois quando eu chamo no meu selectOneMenu ficando assim.

<p:outputLabel value="Marca: " for="marca" />
                    <p:selectOneMenu id="marca" value="#{produtoBean.produto.marca}"
                        required="true" requiredMessage="Marca obrigatória"
                        converter="produtoConverter">
                        <f:selectItem itemValue="" itemLabel="Selecione a opção" />
                        <f:selectItems value="#{produtoBean.marcas}" var="marca"
                            itemLabel="#{marca.marca}" itemValue="#{marca}" />
                    </p:selectOneMenu>

Dai quando abro a pagina de cadastrar o produto, onde tem nome preço etc... também tem o campo de marca, ai escolho a minha marca, e quando clico em salvar o meu campo marca some e aparece a mensagem marca obrigatória porque eu deixei como obrigatória, ai quando tiro o meu converter="produtoConverter" do meu selectOneMenu a minha marca na hora de salvar não some, mas dai não faz o converter. Estou errando na hora de converter?

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

import br.com.bercalini.borracharia.Dao.ProdutoDao;
import br.com.bercalini.borracharia.modelo.Produto;

@FacesConverter("produtoConverter")
public class ProdutoConverter implements Converter{

    @Override
    public Object getAsObject(FacesContext context, UIComponent componente, String valor) {
        try {
            Long codigo = Long.parseLong(valor);
            ProdutoDao dao = new ProdutoDao();
            Produto porId = dao.buscarPorId(codigo);
            return porId;
        }catch (RuntimeException e) {
            return null;
        }    
    }

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

Depois crio o meu equals no produto.

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

Algo errado? porque sera esse problema?

3 respostas
solução!

Fala, Alisson!

Você precisa implementar hash e equals na classe Produto.

Confirma (com debug) se a linha:

return porId;

está conseguindo retornar o id.

Você está usando CDI?

Manoel kkkkkk não estava usando o meu cdi, que merda :(. Eu olhei o seu outro exemplo no tópico e deu certo kkk, muito confuso do outro jeito, prefiro criar um conversor kkkk. Mas mesmo assim muito obrigado me ajudo novamente kkkk

Agora tem um curso novo de CDI aqui no Alura: Curso CDI 1.2: Use uma das principais especificações do JavaEE. (https://cursos.alura.com.br/course/cdi-usando-umas-das-principais-espeficacoes-do-javaee).

Já coloquei aqui na fila de cursos a fazer... hehe.

P.s.: Postei lá no outro tópico a solução usando injeção de dependências.

Bons estudos!

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