Fórum Dúvida em Converter: @EJB+Converter #505164
22/12/2014
0
@FacesConverter("fabricanteConverter")
public class FabricanteConverter implements Converter {
@EJB
private SessionBeanLocal beanLocal;
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
System.out.println("getAsObject: " + value);
if (value != null) {
try {
Long codigo = Long.parseLong(value);
//ProdutoManagerBean produtoManagerBean = (ProdutoManagerBean) context.getExternalContext().getApplicationMap().get("produtoManagerBean");
Fabricante fabricante = (Fabricante) beanLocal.getEntityById(Fabricante.class, codigo);
//System.out.println(fabricante.toString());
return fabricante;
} catch (NumberFormatException e) {
throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "ERRO DE CONVERSÃO", "FABRICANTE NÃO VALIDADO."));
}
} else {
return null;
}
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
System.out.println("getAsString: " + value);
if (value != null && value instanceof Fabricante) {
Fabricante fabricante = (Fabricante) value;
Long codigo = fabricante.getId();
return codigo.toString();
} else {
return null;
}
}
public SessionBeanLocal getBeanLocal() {
return beanLocal;
}
public void setBeanLocal(SessionBeanLocal beanLocal) {
this.beanLocal = beanLocal;
}
}
A interface local é:
@Local
public interface SessionBeanLocal<T, Long extends Serializable> {
public void addEntity(T entity);
public T updateEntity(T entity);
public void removeEntity(Class<T> classToCast, Long ID);
public T getEntityById(Class<T> classToCast, Long ID);
public T getEntity(String namedQuery, Map<String, Object> parameters);
public List<T> getList(Class<T> classToCast);
}
A classe que implementa o SessionBeanLocal é:
package br.edu.ifpb.project.farmacia.sessiobean;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaQuery;
@Stateless
public class SessionBean<T> implements SessionBeanLocal {
@PersistenceContext(unitName = "Drogaria-PU")
private EntityManager entityManager;
@Override
public void addEntity(Object object) {
if (object != null) {
entityManager.persist(object);
}
}
@Override
public Object updateEntity(Object object) {
return entityManager.merge(object);
}
@Override
public void removeEntity(Class classToCast, Serializable ID) {
Object object = getEntityById(classToCast, ID);
if (object != null) {
entityManager.remove(object);
}
}
@Override
public Object getEntityById(Class classToCast, Serializable ID) {
return entityManager.find(classToCast, ID);
}
@Override
public List getList(Class classToCast) {
/*CriteriaQuery query = entityManager.getCriteriaBuilder().createQuery(classToCast);
query.select(query.from(classToCast));
return entityManager.createQuery("SELECT o FROM " + classToCast.getSimpleName() + " o").getResultList();*/
CriteriaQuery cq = entityManager.getCriteriaBuilder().createQuery();
cq.select(cq.from(classToCast));
return entityManager.createQuery(cq).getResultList();
}
@Override
public Object getEntity(String namedQuery, Map parameters) {
Object result = null;
try {
Query query = entityManager.createNamedQuery(namedQuery);
// Method that will populate parameters if they are passed not null and empty
if (parameters != null && !parameters.isEmpty()) {
populateQueryParameters(query, parameters);
}
result = (T) query.getSingleResult();
} catch (Exception e) {
System.out.println("Error while running query: " + e.getMessage());
}
return result;
}
public List getEntityByParameter(String namedQuery, Map parameters) {
List<Object> list = new ArrayList<>();
try {
Query query = entityManager.createNamedQuery(namedQuery);
// Method that will populate parameters if they are passed not null and empty
if (parameters != null && !parameters.isEmpty()) {
populateQueryParameters(query, parameters);
}
list = query.getResultList();
} catch (Exception e) {
System.out.println("Error while running query: " + e.getMessage());
}
return list;
}
private void populateQueryParameters(Query query, Map<String, Object> parameters) {
for (Map.Entry<String, Object> entry : parameters.entrySet()) {
query.setParameter(entry.getKey(), entry.getValue());
}
}
}
O ManagerBean é:
package br.edu.ifpb.project.farmacia.managerbean;
import br.edu.ifpb.project.farmacia.model.Fabricante;
import br.edu.ifpb.project.farmacia.model.Produto;
import br.edu.ifpb.project.farmacia.sessiobean.SessionBeanLocal;
import br.edu.ifpb.project.farmacia.util.FacesUtil;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@ManagedBean(name = "produtoManagerBean")
@ViewScoped
public class ProdutoManagerBean implements Serializable {
@EJB
private SessionBeanLocal bean;
private Produto produto = new Produto();
private Fabricante fabricanteSelecionado = new Fabricante();
private List<Fabricante> listaFabricantes = new ArrayList<>();
private Fabricante fabricante = new Fabricante();
private List<Produto> listaProdutos;
private List<Produto> listaProdutosFiltrados;
private String acao;
private Long codigo;
public ProdutoManagerBean() {
}
public void conversor() {
}
public void adicionarProduto() {
if (produto != null) {
Fabricante fabricanteRecuperado = (Fabricante) bean.getEntityById(Fabricante.class, fabricanteSelecionado.getId());
if (fabricanteRecuperado != null) {
produto.setFabricante(fabricanteRecuperado);
}
bean.addEntity(produto);
System.out.println(produto.toString());
FacesUtil.addMsgInfo("Produto salvo com sucesso!");
} else {
FacesUtil.addMsgErro("Erro ao adicionar produto");
}
}
public Fabricante obterFabricanteById(Long ID) {
return (Fabricante) bean.getEntityById(Fabricante.class, ID);
}
public void novoProduto() {
produto = new Produto();
}
public void excluirProduto() {
if (produto != null) {
bean.removeEntity(Produto.class, produto.getId());
FacesUtil.addMsgInfo("Produto removido com sucesso!");
} else {
FacesUtil.addMsgErro("Erro ao remover produto");
}
}
public void editarProduto() {
Produto produtoEditar = (Produto) bean.getEntityById(Produto.class, produto.getId());
if (produtoEditar != null) {
produtoEditar.setDescricao(produto.getDescricao());
produtoEditar.setPreco(produto.getPreco());
produtoEditar.setQuantidade(produto.getQuantidade());
//produtoEditar.setFabricante(produto.getFabricante());
bean.updateEntity(produtoEditar);
FacesUtil.addMsgInfo("Produto alterado com sucesso!");
} else {
FacesUtil.addMsgErro("Não foi possível alterar produto");
}
}
public void listarProdutos() {
listaProdutos = bean.getList(Produto.class);
}
public void obterProdutoPorCodigo() {
if (codigo != null) {
produto = (Produto) bean.getEntityById(Produto.class, codigo);
}
}
public SessionBeanLocal getBean() {
return bean;
}
public void setBean(SessionBeanLocal bean) {
this.bean = bean;
}
public Produto getProduto() {
return produto;
}
public void setProduto(Produto produto) {
this.produto = produto;
}
public List<Produto> getListaProdutos() {
return listaProdutos;
}
public void setListaProdutos(List<Produto> listaProdutos) {
this.listaProdutos = listaProdutos;
}
public List<Produto> getListaProdutosFiltrados() {
return listaProdutosFiltrados;
}
public void setListaProdutosFiltrados(List<Produto> listaProdutosFiltrados) {
this.listaProdutosFiltrados = listaProdutosFiltrados;
}
public Fabricante getFabricante() {
return fabricante;
}
public void setFabricante(Fabricante fabricante) {
this.fabricante = fabricante;
}
public String getAcao() {
return acao;
}
public void setAcao(String acao) {
this.acao = acao;
}
public Long getCodigo() {
return codigo;
}
public void setCodigo(Long codigo) {
this.codigo = codigo;
}
public List<Fabricante> getListaFabricantes() {
listaFabricantes = bean.getList(Fabricante.class);
return listaFabricantes;
}
public void setListaFabricantes(List<Fabricante> listaFabricantes) {
this.listaFabricantes = listaFabricantes;
}
}
E a página de visão é:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<ui:composition template="/modeloGeral.xhtml">
<ui:define name="metadata">
<f:metadata>
<f:viewParam name="prodAcao" value="#{produtoManagerBean.acao}"/>
<f:viewParam name="prodCodigo" value="#{produtoManagerBean.codigo}"/>
<f:event listener="#{produtoManagerBean.obterProdutoPorCodigo()}" type="preRenderView"/>
</f:metadata>
</ui:define>
<ui:define name="conteudo">
<h:form id="frmProdCad">
<p:toolbar>
<f:facet name="left">
<p:outputLabel value="Produtos"/>
</f:facet>
</p:toolbar>
<h:panelGrid id="panelProdCad" columns="2">
<p:outputLabel value="Código"/>
<p:inputText size="10" value="#{produtoManagerBean.produto.id}" readonly="true"/>
<p:outputLabel value="Descrição"/>
<p:inputText value="#{produtoManagerBean.produto.descricao}" readonly="#{produtoManagerBean.acao=='Excluir'}">
<f:validateBean />
</p:inputText>
<p:outputLabel value="Preço"/>
<p:inputText value="#{produtoManagerBean.produto.preco}" readonly="#{produtoManagerBean.acao=='Excluir'}">
<f:validateBean />
</p:inputText>
<p:outputLabel value="Quantidade"/>
<p:inputText value="#{produtoManagerBean.produto.quantidade}" readonly="#{produtoManagerBean.acao=='Excluir'}">
<f:validateBean />
</p:inputText>
<p:outputLabel value="Fabricante"/>
<p:selectOneMenu value="#{produtoManagerBean.produto.fabricante}" converter="fabricanteConverter" effect="fade" filter="true">
<f:selectItem itemValue="" itemLabel="Selecione um fabricante" />
<f:selectItems value="#{produtoManagerBean.listaFabricantes}" var="fabricante" itemLabel="#{fabricante.descricao}" itemValue="#" />
<f:validateBean />
</p:selectOneMenu>
</h:panelGrid>
<h:panelGrid columns="5">
<p:commandButton value="Novo" actionListener="#{produtoManagerBean.novoProduto()}" update=":msgGlobal :frmProdCad:panelProdCad" rendered="#{produtoManagerBean.acao=='Novo'}"/>
<p:commandButton value="Salvar" actionListener="#{produtoManagerBean.adicionarProduto()}" update=":msgGlobal :frmProdCad:panelProdCad" rendered="#{produtoManagerBean.acao=='Novo'}"/>
<p:commandButton value="Editar" actionListener="#{produtoManagerBean.editarProduto()}" update=":msgGlobal" rendered="#{produtoManagerBean.acao=='Editar'}"/>
<p:commandButton value="Excluir" actionListener="#{produtoManagerBean.excluirProduto()}" update=":msgGlobal" rendered="#{produtoManagerBean.acao=='Excluir'}"/>
<p:button value="Voltar" outcome="produtoPesquisa.xhtml"/>
</h:panelGrid>
</h:form>
</ui:define>
</ui:composition>
</html>
E o erro apresentado é:
17:32:58,490 SEVERE [javax.enterprise.resource.webcontainer.jsf.context] (default task-50) java.lang.NullPointerException at br.edu.ifpb.project.farmacia.converter.FabricanteConverter.getAsObject(FabricanteConverter.java:27) at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:171) at com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectOneValue(MenuRenderer.java:201) at com.sun.faces.renderkit.html_basic.MenuRenderer.getConvertedValue(MenuRenderer.java:318) at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.getConvertedValue(SelectOneMenuRenderer.java:60) at javax.faces.component.UIInput.getConvertedValue(UIInput.java:1046) at javax.faces.component.UIInput.validate(UIInput.java:976) at javax.faces.component.UIInput.executeValidate(UIInput.java:1249) at javax.faces.component.UIInput.processValidators(UIInput.java:712) at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1258) at javax.faces.component.UIForm.processValidators(UIForm.java:253) at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1258) at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1258) at org.primefaces.component.layout.Layout.processValidators(Layout.java:233) at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1258) at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1258) at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1195) at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646) at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85) at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:61) at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:113) at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:56) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:45) at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:61) at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58) at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70) at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:240) at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:227) at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:73) at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:146) at io.undertow.server.Connectors.executeRootHandler(Connectors.java:177) at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:727) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:744)
Gostaria de saber o motivo desse erro, uma vez que quando se chama o fabricanteConverter no selectOneMenu apresenta aquele erro expresso acima. Ou seja, ela não consegui fazer a conversão de Fabricante. Suspeito que @EJB dentro de classes que implementa converter na seja possível.
Anderson Sousa
Curtir tópico
+ 0Posts
22/12/2014
Anderson Sousa
Gostei + 0
30/12/2014
Anderson Sousa
...
package br.edu.ifpb.project.farmacia.managerbean;
import br.edu.ifpb.project.farmacia.converter.FabricanteConverter;
import br.edu.ifpb.project.farmacia.model.Fabricante;
import br.edu.ifpb.project.farmacia.model.Produto;
import br.edu.ifpb.project.farmacia.sessiobean.SessionBeanLocal;
import br.edu.ifpb.project.farmacia.util.FacesUtil;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;
@ManagedBean
@ViewScoped
public class ProdutoManagerBean implements Serializable {
@EJB
private SessionBeanLocal bean;
private Produto produto = new Produto();
private List<Fabricante> listaFabricantes = new ArrayList<>();
private FabricanteConverter fabricanteConverter = new FabricanteConverter();
private Fabricante fabricante = new Fabricante();
private List<Produto> listaProdutos;
private List<Produto> listaProdutosFiltrados;
private String acao;
private Long codigo;
public ProdutoManagerBean() {
}
public void adicionarProduto() {
if (produto != null) {
Fabricante fabricanteRecuperado = (Fabricante) bean.getEntityById(Fabricante.class, fabricante.getId());
if (fabricanteRecuperado != null) {
produto.setFabricante(fabricanteRecuperado);
}
bean.addEntity(produto);
FacesUtil.addMsgInfo("Produto salvo com sucesso!");
} else {
FacesUtil.addMsgErro("Erro ao adicionar produto");
}
}
public Fabricante obterFabricanteById(Long ID) {
return (Fabricante) bean.getEntityById(Fabricante.class, ID);
}
public void novoProduto() {
produto = new Produto();
}
public void excluirProduto() {
if (produto != null) {
bean.removeEntity(Produto.class, produto.getId());
FacesUtil.addMsgInfo("Produto removido com sucesso!");
} else {
FacesUtil.addMsgErro("Erro ao remover produto");
}
}
public void editarProduto() {
Produto produtoEditar = (Produto) bean.getEntityById(Produto.class, produto.getId());
if (produtoEditar != null) {
produtoEditar.setDescricao(produto.getDescricao());
produtoEditar.setPreco(produto.getPreco());
produtoEditar.setQuantidade(produto.getQuantidade());
//produtoEditar.setFabricante(produto.getFabricante());
bean.updateEntity(produtoEditar);
FacesUtil.addMsgInfo("Produto alterado com sucesso!");
} else {
FacesUtil.addMsgErro("Não foi possível alterar produto");
}
}
public void listarProdutos() {
listaProdutos = bean.getList(Produto.class);
}
public void obterProdutoPorCodigo() {
if (codigo != null) {
produto = (Produto) bean.getEntityById(Produto.class, codigo);
}
}
public List<SelectItem> getAllFabricantes() {
List<SelectItem> itens = new ArrayList<>();
for(Fabricante fab : getListaFabricantes()) {
itens.add(new SelectItem(fab, fab.getDescricao()));
}
return itens;
}
public SessionBeanLocal getBean() {
return bean;
}
public void setBean(SessionBeanLocal bean) {
this.bean = bean;
}
public Produto getProduto() {
return produto;
}
public void setProduto(Produto produto) {
this.produto = produto;
}
public List<Produto> getListaProdutos() {
return listaProdutos;
}
public void setListaProdutos(List<Produto> listaProdutos) {
this.listaProdutos = listaProdutos;
}
public List<Produto> getListaProdutosFiltrados() {
return listaProdutosFiltrados;
}
public void setListaProdutosFiltrados(List<Produto> listaProdutosFiltrados) {
this.listaProdutosFiltrados = listaProdutosFiltrados;
}
public Fabricante getFabricante() {
return fabricante;
}
public void setFabricante(Fabricante fabricante) {
this.fabricante = fabricante;
}
public String getAcao() {
return acao;
}
public void setAcao(String acao) {
this.acao = acao;
}
public Long getCodigo() {
return codigo;
}
public void setCodigo(Long codigo) {
this.codigo = codigo;
}
public List<Fabricante> getListaFabricantes() {
listaFabricantes = bean.getList(Fabricante.class);
return listaFabricantes;
}
public void setListaFabricantes(List<Fabricante> listaFabricantes) {
this.listaFabricantes = listaFabricantes;
}
public FabricanteConverter getFabricanteConverter() {
fabricanteConverter.setBeanLocal(bean);
return fabricanteConverter;
}
public void setFabricanteConverter(FabricanteConverter fabricanteConverter) {
this.fabricanteConverter = fabricanteConverter;
}
}
Já na página cadastraProduto.xhtml fiz a seguinte modificação:
...
<p:outputLabel value="Fabricante"/>
<p:selectOneMenu value="#{produtoManagerBean.fabricante}" id="fabricante" converter="#{produtoManagerBean.fabricanteConverter}">
<f:selectItem itemValue="" itemLabel="Selecione um fabricante" />
<f:selectItems value="#{produtoManagerBean.allFabricantes}"/>
<f:validateBean />
</p:selectOneMenu>
Pronto, resolvido o problema de conversão!
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)