PAGUE 6 MESES
LEVE 12 MESES
GARANTIR DESCONTO

Fórum Dúvida em Converter: @EJB+Converter #505164

22/12/2014

0

Bom dia amigos, gostaria de tirar uma dúvida qui no tocante à classes que implementa converter. Tenho um conversor do tipo:
@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

Anderson Sousa

Responder

Posts

22/12/2014

Anderson Sousa

Alguma dica?
Responder

Gostei + 0

30/12/2014

Anderson Sousa

Consegui resolver amigos. Na classe ProdutoManagerBean criei uma instância de FabricanteConverter e seguida implementei um método getAllFabricantes() que captura a descrição do fabricante utilizando SelectItem. Segue as modificações adicionadas ao Manager Bean.
...
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!
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar