Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Chamar uma consulta no Converter do JSF 2.2, CDI 1.2

5 respostas
solução

Oi Matias,

O problema não é na configuração do producer do entityManager, mas sim na integração entre JSF e CDI.

Como o converter é uma classe gerenciada pelo JSF, o CDI não consegue fazer a injeção e o atributo acaba ficando null.

Para funcionar, você precisa fazer com que o CDI gerencie o converter:

@Named
public class CargoConverter implements Converter {

    @Inject
    private EntityManager em;

        @Override
    public Object getAsObject(FacesContext context, UIComponent component, String valor) {
        Long id = Long.valueOf(valor);
        return em.find(Cargo.class, id);
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object object) {

        if (object != null) {
            return  ((Cargo) object).getId().toString();
        }
        return "";
    }

}

E no XHTML tem que utilizar Expression Language para indicar o converter:

<h:selectOneMenu converter="#{cargoConverter}">

Desse jeito deve funcionar.

Bons estudos!

Rodrigo Ferreira, obrigado pela dica. Vou testar.

Mas queria saber se isso não quebra o modelo MVC, já que estou solicitando e recebendo dados da View para o Model?

Acredito que não, pois o converter vai ser chamado após disparar o request, e ele faz parte do Model.

A view não estará chamando diretamente o converter.

Converter faz parte do Model? não entendi.

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

O Converter não é View(xhtml) e nem Controller(Managed Bean), logo ele é uma das classes do Model do projeto.

Converters, Validators, Entidades JPA, Daos, etc. são todas classes do Model de uma aplicação.