Minha dúvida é essa: https://cursos.alura.com.br/forum/topico-injecao-com-valor-null-para-o-conversor-45139
Qual a solução?
Minha dúvida é essa: https://cursos.alura.com.br/forum/topico-injecao-com-valor-null-para-o-conversor-45139
Qual a 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.