Erro JNDI lookup failed for the resource

Galera, estou recebendo o erro JNDI lookup failed for the resource e não consigo entender o porque disso estar acontecendo, sendo que eu estou mostrando o caminho exato para ela.

@EJB
    private br.com.celg.sessao.ObrasFacade obrasFacade;

@PostConstruct
    public void inicializarLista() {

        Map<String, Object> map = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
        if (!map.containsKey("obraFacade")) {
            map.put("obraFacade", obrasFacade);
        }
    }

FACADE:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.celg.sessao;

import br.com.celg.entidade.ClassTaxonomia;
import br.com.celg.entidade.Obras;
import br.com.celg.sessao.interfaceFacade.ObrasFacadeLocal;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

/**
 *
 * @author Rodrigo
 */
@Stateless
public class ObrasFacade extends AbstractFacade<Obras> implements ObrasFacadeLocal {
    @PersistenceContext(unitName = "SGT-SGIPU")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public ObrasFacade() {
        super(Obras.class);
    }
    
    @Override
    public int count(String consultarPor, String parametroConsulta, ClassTaxonomia idClassTaxonomia, String tensao) {

        String classe = Obras.class.getName().toString();

        String nomePuro = classe.substring(classe.lastIndexOf(".") + 1, classe.length());

        StringBuilder sb = new StringBuilder();
        sb.append("select count(").append(nomePuro.toLowerCase()).append(".id) from ").append(nomePuro).append(" ").append(nomePuro.toLowerCase()).append(" ");
        sb.append(" where 1 = 1 ");

        if (idClassTaxonomia != null) {
            sb.append(" and ").append(nomePuro.toLowerCase()).append(".idClassTaxonomia.id = :taxonomiaID ");
        }
        if (tensao != null && !tensao.isEmpty()) {
            sb.append(" and ").append(nomePuro.toLowerCase()).append(".tensao like :valorTensao ");
        }
        if(parametroConsulta != null && !parametroConsulta.isEmpty()) {
            switch (consultarPor) {
                case "ODEX":
                    sb.append(" and ").append(nomePuro.toLowerCase()).append(".odex like '%").append(parametroConsulta).append("%'");
                    break;
                case "titulo":
                    sb.append(" and ").append(nomePuro.toLowerCase()).append(".titulo like '%").append(parametroConsulta).append("%'");
                    break;
                case "tipoObra":
                    sb.append(" and ").append(nomePuro.toLowerCase()).append(".tipoObra like '%").append(parametroConsulta).append("%'");
                    break;
                case "codProjeto":
                    sb.append(" and ").append(nomePuro.toLowerCase()).append(".codProjeto =").append(parametroConsulta);
                    break;
                default:
                    sb.append(" and ").append(nomePuro.toLowerCase()).append(".").append(consultarPor).append(" = ").append(parametroConsulta);
                    break;
            }
        }
        
        
        javax.persistence.Query q = getEntityManager().createQuery(sb.toString());

        if (idClassTaxonomia != null) {
            q.setParameter("taxonomiaID", idClassTaxonomia.getId());
        }
        if (tensao != null && !tensao.isEmpty()) {
            q.setParameter("valorTensao", tensao);
        }
        
        return ((Long) q.getSingleResult()).intValue();
    }
    
    
    
    @Override
    public List findRange(int[] range, String consultarPor, String parametroConsulta, ClassTaxonomia idClassTaxonomia, String tensao){

        String classe = Obras.class.getName().toString();

        String nomePuro = classe.substring(classe.lastIndexOf(".") + 1, classe.length());

        StringBuilder sb = new StringBuilder();
        sb.append("select ").append(nomePuro.toLowerCase()).append(" from ").append(nomePuro).append(" ").append(nomePuro.toLowerCase()).append(" ");
        sb.append(" where 1 = 1 ");

        if (idClassTaxonomia != null) {
            sb.append(" and ").append(nomePuro.toLowerCase()).append(".idClassTaxonomia.id = :taxonomiaID ");
        }
        if (tensao != null && !tensao.isEmpty()) {
            sb.append(" and ").append(nomePuro.toLowerCase()).append(".tensao like :valorTensao ");
        }
        if(parametroConsulta != null && !parametroConsulta.isEmpty()) {
            switch (consultarPor) {
                case "ODEX":
                    sb.append(" and ").append(nomePuro.toLowerCase()).append(".odex like '%").append(parametroConsulta).append("%'");
                    break;
                case "titulo":
                    sb.append(" and ").append(nomePuro.toLowerCase()).append(".titulo like '%").append(parametroConsulta).append("%'");
                    break;
                case "tipoObra":
                    sb.append(" and ").append(nomePuro.toLowerCase()).append(".tipoObra like '%").append(parametroConsulta).append("%'");
                    break;
                case "codProjeto":
                    sb.append(" and ").append(nomePuro.toLowerCase()).append(".codProjeto =").append(parametroConsulta);
                    break;
                default:
                    sb.append(" and ").append(nomePuro.toLowerCase()).append(".").append(consultarPor).append(" = ").append(parametroConsulta);
                    break;
            }
        }
        
        sb.append(" order by ").append(nomePuro.toLowerCase()).append(".titulo ");
        
        javax.persistence.Query q = getEntityManager().createQuery(sb.toString());

        if (idClassTaxonomia != null) {
            q.setParameter("taxonomiaID", idClassTaxonomia.getId());
        }
        if (tensao != null && !tensao.isEmpty()) {
            q.setParameter("valorTensao", tensao);
        }

        q.setMaxResults(range[1] - range[0]);
        q.setFirstResult(range[0]);
        return q.getResultList();
    }
    
}

Classe Controller completa:

package br.com.celg.controlado;

import br.com.celg.entidade.Obras;
import br.com.celg.controlado.util.AbstractController;
import br.com.celg.controlado.util.JsfUtil;
import br.com.celg.controlado.util.PaginationHelper;
import br.com.celg.entidade.ClassTaxonomia;
import br.com.celg.sessao.interfaceFacade.ObrasFacadeLocal;

import java.util.ArrayList;
import java.util.List;
import java.io.Serializable;
import java.io.ByteArrayOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.util.Map;
import java.util.ResourceBundle;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.faces.model.SelectItem;

@ManagedBean(name = "obrasController")
@ViewScoped
public class ObrasController extends AbstractController implements Serializable {

    private Obras current;
    @EJB
    private br.com.celg.sessao.interfaceFacade.ObrasFacadeLocal ejbFacade;
    @EJB
    private br.com.celg.sessao.ObrasFacade obrasFacade;
    private List<Obras> obrasList;
    private ClassTaxonomia taxonomia;
    private String tensao;

    @Override
    public SelectItem[] getSelectItemsConsulta() {
        SelectItem[] itemsLocal = new SelectItem[4];
        //itemsLocal[0] = new SelectItem("id", ResourceBundle.getBundle("/Bundle").getString("CreateObrasTitle_id"));
        itemsLocal[0] = new SelectItem("titulo", ResourceBundle.getBundle("/Bundle").getString("CreateObrasTitle_titulo"));
        //itemsLocal[2] = new SelectItem("recurso", ResourceBundle.getBundle("/Bundle").getString("CreateObrasTitle_recurso"));
        itemsLocal[1] = new SelectItem("codProjeto", ResourceBundle.getBundle("/Bundle").getString("CreateObrasTitle_codProjeto"));
        itemsLocal[2] = new SelectItem("odex", ResourceBundle.getBundle("/Bundle").getString("CreateObrasTitle_odex"));
        itemsLocal[3] = new SelectItem("tipoObra", ResourceBundle.getBundle("/Bundle").getString("CreateObrasTitle_tipoObra"));
        //itemsLocal[6] = new SelectItem("dataPrevEnerg", ResourceBundle.getBundle("/Bundle").getString("CreateObrasTitle_dataPrevEnerg"));
        //itemsLocal[7] = new SelectItem("dataPrevConclusao", ResourceBundle.getBundle("/Bundle").getString("CreateObrasTitle_dataPrevConclusao"));
        //itemsLocal[8] = new SelectItem("responsavelContratacoes", ResourceBundle.getBundle("/Bundle").getString("CreateObrasTitle_responsavelContratacoes"));
        //itemsLocal[9] = new SelectItem("statusContrato", ResourceBundle.getBundle("/Bundle").getString("CreateObrasTitle_statusContrato"));
        //itemsLocal[10] = new SelectItem("terreno", ResourceBundle.getBundle("/Bundle").getString("CreateObrasTitle_terreno"));
        //itemsLocal[11] = new SelectItem("obrasExtensao", ResourceBundle.getBundle("/Bundle").getString("CreateObrasTitle_obrasExtensao"));
        //itemsLocal[12] = new SelectItem("autorizacoesObrasList", ResourceBundle.getBundle("/Bundle").getString("CreateObrasTitle_autorizacoesObrasList"));
        //itemsLocal[13] = new SelectItem("orcamentoObrasList", ResourceBundle.getBundle("/Bundle").getString("CreateObrasTitle_orcamentoObrasList"));
        //itemsLocal[3] = new SelectItem("idClassTaxonomia", ResourceBundle.getBundle("/Bundle").getString("CreateObrasTitle_idClassTaxonomia"));
        //itemsLocal[4] = new SelectItem("tensao", ResourceBundle.getBundle("/Bundle").getString("CreateObrasTitle_tensao"));
        return itemsLocal;
    }

    public ObrasController() {
    }

    private List<Obras> listaObras;

    public List<Obras> getListaObras() {
        return listaObras;
    }

    public void setListaObras(List<Obras> listaObras) {
        this.listaObras = listaObras;
    }
    
    @PostConstruct
    public void inicializarLista() {
        listaObras = ejbFacade.findAll();
        
        //Inicializa Complete
        Map<String, Object> map = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
        if (!map.containsKey("obraFacade")) {
            map.put("obraFacade", obrasFacade);
        }
    }
    
    public Obras getSelected() {
        if (current == null) {
            current = new Obras();
            selectedItemIndex = -1;
        }
        return current;
    }

    public void setSelected(Obras entidade) {
        this.current = entidade;
    }

    //Método complete de obras.
    public List<Obras> completeObras(String query) {
        return JsfUtil.complete(query, obrasList, obrasFacade);
    }
    
    public void selecionarAutorizacoesObrasList() {
        try {
            br.com.celg.entidade.AutorizacoesObras objeto = (br.com.celg.entidade.AutorizacoesObras) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("item");
            getSelected().getAutorizacoesObrasList().add(objeto);
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, e.getMessage());
        }
    }

    public void removerAutorizacoesObrasList() {
        try {
            br.com.celg.entidade.AutorizacoesObras objeto = (br.com.celg.entidade.AutorizacoesObras) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("item");
            getSelected().getAutorizacoesObrasList().remove(objeto);
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, e.getMessage());
        }
    }

    public void selecionarOrcamentoObrasList() {
        try {
            br.com.celg.entidade.OrcamentoObras objeto = (br.com.celg.entidade.OrcamentoObras) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("item");
            getSelected().getOrcamentoObrasList().add(objeto);
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, e.getMessage());
        }
    }

    public void removerOrcamentoObrasList() {
        try {
            br.com.celg.entidade.OrcamentoObras objeto = (br.com.celg.entidade.OrcamentoObras) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("item");
            getSelected().getOrcamentoObrasList().remove(objeto);
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, e.getMessage());
        }
    }
    
    public void selecionarObrasContratacoesList() {
        try {
            br.com.celg.entidade.ObrasContratacoes objeto = (br.com.celg.entidade.ObrasContratacoes) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("item");
            getSelected().getObrasContratacoesList().add(objeto);
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, e.getMessage());
        }
    }

    public void removerObrasContratacoesList() {
        try {
            br.com.celg.entidade.ObrasContratacoes objeto = (br.com.celg.entidade.ObrasContratacoes) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("item");
            getSelected().getObrasContratacoesList().remove(objeto);
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, e.getMessage());
        }
    }

    private ObrasFacadeLocal getFacade() {
        return ejbFacade;
    }

    public ClassTaxonomia getTaxonomia() {
        return taxonomia;
    }

    public void setTaxonomia(ClassTaxonomia taxonomia) {
        this.taxonomia = taxonomia;
    }

    public String getTensao() {
        return tensao;
    }

    public void setTensao(String tensao) {
        this.tensao = tensao;
    }

    public PaginationHelper getPagination() {
        if (pagination == null) {
            pagination = new PaginationHelper(10) {
                @Override
                public int getItemsCount() throws Exception {
                    return getFacade().count(getConsultarPor(), getParametroConsulta(), getTaxonomia(), getTensao());
                }

                @Override
                public DataModel createPageDataModel() throws Exception {
                    return new ListDataModel(getFacade().findRange(new int[]{getPageFirstItem(), getPageFirstItem() + getPageSize()}, getConsultarPor(), getParametroConsulta(), getTaxonomia(), getTensao()));
                }
            };
        }
        return pagination;
    }

    public String prepareView() {
        current = (Obras) getItems().getRowData();
        selectedItemIndex = pagination.getPageFirstItem() + getItems().getRowIndex();
        return "View";
    }

    public String prepareCreate() {
        current = new Obras();
        selectedItemIndex = -1;
        return "Create";
    }

    public String create() {
        try {
            getFacade().create(current);
            JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("ObrasCreated"));
            return prepareCreate();
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
            return null;
        }
    }

    public String prepareEdit() {
        current = (Obras) getItems().getRowData();
        selectedItemIndex = pagination.getPageFirstItem() + getItems().getRowIndex();
        return "Edit";
    }

    public String update() {
        try {
            getFacade().edit(current);
            JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("ObrasUpdated"));
            return "List";
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
            return null;
        }
    }

    public String destroy() {
        current = (Obras) getItems().getRowData();
        selectedItemIndex = pagination.getPageFirstItem() + getItems().getRowIndex();
        performDestroy();
        recreateModel();
        return "List";
    }

    public String destroyAndView() {
        performDestroy();
        recreateModel();
        updateCurrentItem();
        if (selectedItemIndex >= 0) {
            return "View";
        } else {
            // all items were removed - go back to list
            recreateModel();
            return "List";
        }
    }

    private void performDestroy() {
        try {
            getFacade().remove(current);
            JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("ObrasDeleted"));
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
        }
    }

    private void updateCurrentItem() {
        int count = getFacade().count();
        if (selectedItemIndex >= count) {
            // selected index cannot be bigger than number of items:
            selectedItemIndex = count - 1;
            // go to previous page if last page disappeared:
            if (pagination.getPageFirstItem() >= count) {
                pagination.previousPage();
            }
        }
        if (selectedItemIndex >= 0) {
            current = getFacade().findRange(new int[]{selectedItemIndex, selectedItemIndex + 1}).get(0);
        }
    }

    @Override
    public void consultar() {
        try {
            //getPagination().getItemsCount();
            items = getPagination().createPageDataModel();
        } catch (Exception ex) {
            JsfUtil.addErrorMessage(ex, ResourceBundle.getBundle("/Bundle").getString("OcorreuErro"));
        }
    }

    public void next() {
        try {
            getPagination().nextPage();
            items = getPagination().createPageDataModel();
        } catch (Exception ex) {
            JsfUtil.addErrorMessage(ex, ResourceBundle.getBundle("/Bundle").getString("OcorreuErro"));
        }
    }

    public void previous() {
        try {
            getPagination().previousPage();
            items = getPagination().createPageDataModel();
        } catch (Exception ex) {
            JsfUtil.addErrorMessage(ex, ResourceBundle.getBundle("/Bundle").getString("OcorreuErro"));
        }

    }

    public void inicio() {
        try {
            getPagination().startPage();
            items = getPagination().createPageDataModel();
        } catch (Exception ex) {
            JsfUtil.addErrorMessage(ex, ResourceBundle.getBundle("/Bundle").getString("OcorreuErro"));
        }

    }

    public void fim() {
        try {
            getPagination().endPage();
            items = getPagination().createPageDataModel();
        } catch (Exception ex) {
            JsfUtil.addErrorMessage(ex, ResourceBundle.getBundle("/Bundle").getString("OcorreuErro"));
        }

    }

    public SelectItem[] getItemsAvailableSelectMany() {
        return JsfUtil.getSelectItems(ejbFacade.findAll(), false);
    }

    public SelectItem[] getItemsAvailableSelectOne() {
        return JsfUtil.getSelectItems(ejbFacade.findAll(), true);
    }

    public void gerarRelatorio() {
        try {


            ByteArrayOutputStream baos = null;
            //JsfUtil.relatorio(null, null, new int[]{3, 10, 6, 6, 3, 3, 3, 4}, null, null);

            HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
            response.setHeader("Expires", "0");
            response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
            response.setHeader("Pragma", "public");
            response.setContentType("application/pdf");
//            response.setContentType("application/force-download");
            response.setContentLength(baos.size());
            OutputStream os = response.getOutputStream();
            baos.writeTo(os);
            os.flush();
            os.close();

        } catch (Exception ex) {
            JsfUtil.addErrorMessage(ex, ResourceBundle.getBundle("/Bundle").getString("OcorreuErro"));
        }
    }

    @FacesConverter(forClass = Obras.class)
    public static class ObrasControllerConverter implements Converter {

        public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
            if (value == null || value.length() == 0 || value.equals("null")) {
                return null;
            }
            ObrasController controller = (ObrasController) facesContext.getApplication().getELResolver().
                    getValue(facesContext.getELContext(), null, "obrasController");
            return controller.ejbFacade.find(getKey(value));
        }

        java.math.BigDecimal getKey(String value) {
            java.math.BigDecimal key;
            key = new java.math.BigDecimal(value);
            return key;
        }

        String getStringKey(java.math.BigDecimal value) {
            StringBuffer sb = new StringBuffer();
            sb.append(value);
            return sb.toString();
        }

        public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
            if (object == null) {
                return null;
            }
            if (object instanceof Obras) {
                Obras o = (Obras) object;
                return getStringKey(o.getId());
            } else {
                throw new IllegalArgumentException("object " + object + " is of type " + object.getClass().getName() + "; expected type: " + ObrasController.class.getName());
            }
        }
    }

    @FacesConverter(value = "ObrasConverter")
    public static class ObrasController2Converter implements Converter {

        public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
            if (value == null || value.length() == 0 || value.equals("null")) {
                return null;
            }
            ObrasController controller = (ObrasController) facesContext.getApplication().getELResolver().
                    getValue(facesContext.getELContext(), null, "obrasController");
            return controller.ejbFacade.find(getKey(value));
        }

        java.math.BigDecimal getKey(String value) {
            java.math.BigDecimal key;
            key = new java.math.BigDecimal(value);
            return key;
        }

        String getStringKey(java.math.BigDecimal value) {
            StringBuffer sb = new StringBuffer();
            sb.append(value);
            return sb.toString();
        }

        public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
            if (object == null) {
                return null;
            }
            if (object instanceof Obras) {
                Obras o = (Obras) object;
                return getStringKey(o.getId());
            } else {
                throw new IllegalArgumentException("object " + object + " is of type " + object.getClass().getName() + "; expected type: " + ObrasController.class.getName());
            }
        }
    }
    
    @PreDestroy
    public void shutdown() {
        resetPage();
        Map<String, Object> map = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
        map.remove("obraFacade");
    }
    
    public void resetPage() {
        obrasList = null;
    }
}

E as configurações?

Quais? :thinking:

Isso tudo é local ou remoto?
O que aparece no log?

Remoto

Grave: Exception while deploying the app [SGT-SGI] : JNDI lookup failed for the resource: Name: [java:module/env/br.com.celg.controlado.ObrasController/obrasFacade], Lookup: [br.com.celg.sessao.ObrasFacade#br.com.celg.sessao.ObrasFacade], Type: [Session]
javax.naming.NamingException: Lookup failed for ‘br.com.celg.sessao.ObrasFacade#br.com.celg.sessao.ObrasFacade’ in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: br.com.celg.sessao.ObrasFacade#br.com.celg.sessao.ObrasFacade not found]
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:491)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:438)

Então, para JNDI remoto, normalmente, você define um arquivo de propriedades informando como vai acessar o servidor e outros detalhes (usuário, senha, etc), carrega isso numa instância de Properties e, só então, tenta o lookup.
Qual application server está usando?

GlassFish

Nunca usei glassfish.
Mas, dá uma olhada nesta thread

image

Mas aqui a ObrasFacade já está configurada como uma EJB… Isso que é estranho, ou não seria isso? @darlan_machado

Cara, eu não sei como isso se comporta no glassfish, pois nunca usei esse AS.
No JBoss/Wildfly, basicamente, a gente criava o EJB (interface e a implementação) e subia.

Para construir o client, precisávamos pegar o jboss-client.jar (algo assim), alguns outros jars e criar um arquivo de propriedades mapeando as informações de acesso.
Depois, criávamos a classe que iria invocar o EJB remoto, obtinha as propriedades e fazia a chamada via lookup.