当前位置: 首页 > 知识库问答 >
问题:

javax.naming。ejb查找时发生NameNotFoundException

殷烨
2023-03-14

我正在将一个ejb应用程序从weblogic迁移到jboss。该应用程序正在寻找使用jndi的ejb。我有ejb-jar.xml和jboss.xml到WEB-INF/中,如下所示

jboss.xml

<!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 4.0//EN"
   "http://www.jboss.org/j2ee/dtd/jboss_4_0.dtd">

<jboss>
    <enterprise-beans>
        <session>
            <ejb-name>DataAccessEJB</ejb-name>
            <jndi-name>HeatMapDataAccessJNDI</jndi-name>
            <local-jndi-name>HeatMapDataAccessLocalJNDI</local-jndi-name>
        </session>
        <session>
            <ejb-name>PMSessionFacadeEJB</ejb-name>
            <jndi-name>PMSessionFacadeJNDI</jndi-name>
            <local-jndi-name>PMSessionFacadeLocalJNDI</local-jndi-name>
        </session>
        <session>
            <ejb-name>RRMSessionFacadeEJB</ejb-name>
            <jndi-name>RRMSessionFacadeJNDI</jndi-name>
            <local-jndi-name>RRMSessionFacadeLocalJNDI</local-jndi-name>
        </session>
        <session>
            <ejb-name>FIPMSessionFacadeEJB</ejb-name>
            <jndi-name>FIPMSessionFacadeJNDI</jndi-name>
            <local-jndi-name>FIPMSessionFacadeLocalJNDI</local-jndi-name>
        </session>              
    </enterprise-beans>
</jboss>

ejb-jar.xml

<?xml version="1.0"?>
<!DOCTYPE ejb-jar PUBLIC
"-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN"
"http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar>
    <enterprise-beans>
    <!-- A list of all the session and entity beans packaged within this jar file. -->
        <session>
            <!-- An arbitrary identifier that's used to match up this description of the bean with the
         corresponding entry in the weblogic-ejb-jar.xml file -->
            <ejb-name>
        DataAccessEJB
            </ejb-name>

            <!-- The name of the interface implemented by the bean's home object -->
            <home>
        com.bfm.app.pirptfe.heatmap.ejb.DataAccessHomeInterface
            </home>

            <!-- The name of the interface implemented by the bean's remote object -->
            <remote>
        com.bfm.app.pirptfe.heatmap.ejb.DataAccessRemoteInterface
            </remote>
            <local-home>
                com.bfm.app.pirptfe.heatmap.ejb.DataAccessLocalHomeInterface
            </local-home>
            <local>
                com.bfm.app.pirptfe.heatmap.ejb.DataAccessLocalInterface
            </local>
            <!-- The name of the bean class -->
            <ejb-class>
        com.bfm.app.pirptfe.heatmap.ejb.DataAccessBean
            </ejb-class>

            <!-- Is this session bean Stateful or Stateless? -->
            <session-type>
        Stateless
            </session-type>

            <!-- If this bean uses any transactions, will these transactions be managed by the Container or
         by the Bean itself? -->
            <transaction-type>
        Container
            </transaction-type>
    </session>

        <session>
            <ejb-name>
        PMSessionFacadeEJB
            </ejb-name>
            <home>
        com.bfm.app.pirptfe.heatmap.ejb.PMSessionFacadeHome
            </home>
            <remote>
        com.bfm.app.pirptfe.heatmap.ejb.PMSessionFacadeRemote
            </remote>
            <ejb-class>
        com.bfm.app.pirptfe.heatmap.ejb.PMSessionFacadeBean
            </ejb-class>
            <session-type>
        Stateless
            </session-type>
            <transaction-type>
        Container
            </transaction-type>     
        </session>
        <session>
            <ejb-name>
        RRMSessionFacadeEJB
            </ejb-name>
            <home>
        com.bfm.app.pirptfe.heatmap.ejb.RRMSessionFacadeHome
            </home>
            <remote>
        com.bfm.app.pirptfe.heatmap.ejb.RRMSessionFacadeRemote
            </remote>
            <ejb-class>
        com.bfm.app.pirptfe.heatmap.ejb.RRMSessionFacadeBean
            </ejb-class>
            <session-type>
        Stateless
            </session-type>
            <transaction-type>
        Container
            </transaction-type>     
        </session>     
        <session>
            <ejb-name>
        FIPMSessionFacadeEJB
            </ejb-name>
            <home>
        com.bfm.app.pirptfe.heatmap.ejb.FIPMSessionFacadeHome
            </home>
            <remote>
        com.bfm.app.pirptfe.heatmap.ejb.FIPMSessionFacadeRemote
            </remote>
            <ejb-class>
        com.bfm.app.pirptfe.heatmap.ejb.FIPMSessionFacadeBean
            </ejb-class>
            <session-type>
        Stateless
            </session-type>
            <transaction-type>
        Container
            </transaction-type>     
        </session>   
    </enterprise-beans>
</ejb-jar>

当我运行应用程序时,它会加载。日志如下所示

14:08:16,990 INFO  [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-1) JNDI bindings for session bean named FIPMSessionFacadeEJB in deployment unit deployment "pirptfe.war" are as follows:

    java:global/pirptfe/FIPMSessionFacadeEJB!com.bfm.app.pirptfe.heatmap.ejb.FIPMSessionFacadeRemote
    java:app/pirptfe/FIPMSessionFacadeEJB!com.bfm.app.pirptfe.heatmap.ejb.FIPMSessionFacadeRemote
    java:module/FIPMSessionFacadeEJB!com.bfm.app.pirptfe.heatmap.ejb.FIPMSessionFacadeRemote
    java:jboss/exported/pirptfe/FIPMSessionFacadeEJB!com.bfm.app.pirptfe.heatmap.ejb.FIPMSessionFacadeRemote
    java:global/pirptfe/FIPMSessionFacadeEJB!com.bfm.app.pirptfe.heatmap.ejb.FIPMSessionFacadeHome
    java:app/pirptfe/FIPMSessionFacadeEJB!com.bfm.app.pirptfe.heatmap.ejb.FIPMSessionFacadeHome
    java:module/FIPMSessionFacadeEJB!com.bfm.app.pirptfe.heatmap.ejb.FIPMSessionFacadeHome
    java:jboss/exported/pirptfe/FIPMSessionFacadeEJB!com.bfm.app.pirptfe.heatmap.ejb.FIPMSessionFacadeHome

在我的代码中,用于查找服务的JNDI名称如下所示

// The JNDI Names used to lookup a service
private static final String PMSESSIONFACADEEJB_JNDIHOME   =
        "PMSessionFacadeJNDI";
private static final String RRMSESSIONFACADEEJB_JNDIHOME  =
        "RRMSessionFacadeJNDI";
private static final String FIPMSESSIONFACADEEJB_JNDIHOME =
        "FIPMSessionFacadeJNDI";

当代码尝试使用以下代码在上下文中查找 ejb 时,它会给出异常

serviceName是下面代码中的JNDI名称

public EJBHome getEJBHome(int parServiceId)
                   throws FrontServiceLocatorException {

    // Trying to find the JNDI Name for the reqested service
    String  serviceName = getServiceName(parServiceId);
    EJBHome ejbHome = null;
    try {

        // Checking to see if I can find the EJBHome interface in the cache
        if (ejbHomeCashe_.containsKey(serviceName)) {
            ejbHome = (EJBHome)ejbHomeCashe_.get(serviceName);
            return ejbHome;
        } else {

            // I could not find the home interface in the cache, look it up
            // and then cache it
            Context ctx         = new InitialContext();
            Object  jndiRef     = ctx.lookup(serviceName);
            Object  portableObj = PortableRemoteObject.narrow(jndiRef,
                                                              getEJBHomeRef(
                                                                      parServiceId));
            ejbHome = (EJBHome)portableObj;
            ejbHomeCashe_.put(serviceName, ejbHome);
            return ejbHome;
        }
    } catch (NamingException e) {
        throw new FrontServiceLocatorException("Naming exception error in FrontServiceLocator.getEJBHome()",
                                               e);
    }
     catch (Exception e) {
        throw new FrontServiceLocatorException("General exception in FrontServiceLocator.getEJBHome()",
                                               e);
    }
}

例外情况:

18:40:12,376 ERROR [stderr] (http-localhost-127.0.0.1-8080-1) javax.naming.NameNotFoundException: RRMSessionFacadeJNDI -- service jboss.naming.context.java.RRMSessionFacadeJNDI

18:40:12,376 ERROR [stderr] (http-localhost-127.0.0.1-8080-1)   at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:97)

18:40:12,392 ERROR [stderr] (http-localhost-127.0.0.1-8080-1)   at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:178)

18:40:12,392 ERROR [stderr] (http-localhost-127.0.0.1-8080-1)   at org.jboss.as.naming.InitialContext.lookup(InitialContext.java:113)

18:40:12,392 ERROR [stderr] (http-localhost-127.0.0.1-8080-1)   at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:214)

18:40:12,407 ERROR [stderr] (http-localhost-127.0.0.1-8080-1)   at javax.naming.InitialContext.lookup(InitialContext.java:411)

18:40:12,407 ERROR [stderr] (http-localhost-127.0.0.1-8080-1)   at com.bfm.app.pirptfe.heatmap.web.FrontServiceLocator.getEJBHome(FrontServiceLocator.java:191)

18:40:12,407 ERROR [stderr] (http-localhost-127.0.0.1-8080-1)   at com.bfm.app.pirptfe.heatmap.web.CommonalityRRM.process(CommonalityRRM.java:77)

18:40:12,423 ERROR [stderr] (http-localhost-127.0.0.1-8080-1)   at com.bfm.app.pirptfe.heatmap.web.CommonalityRRM.doPost(CommonalityRRM.java:54)

18:40:12,423 ERROR [stderr] (http-localhost-127.0.0.1-8080-1)   at javax.servlet.http.HttpServlet.service(HttpServlet.java:754)

有人能帮我解决吗。

共有1个答案

龙俭
2023-03-14

我的问题还没有解决,但我得到了我在这里做错什么的答案。

    < li >我们必须用jboss-ejb3.xml而不是jboss.xml来重命名该文件 < li >我们可以使用jboss-ejb3.xml覆盖我们的EJ B- jar . XML

jboss-ejb3.xml

<jboss:ejb-jar xmlns:jboss="http://www.jboss.com/xml/ns/javaee" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:s="urn:security"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd
                     http://java.sun.com/xml/ns/javaee"
    version="3.1" impl-version="2.0">
    <enterprise-beans>
		<session>
			<ejb-name>DataAccessEJB</ejb-name>
			<resource-ref>
			    <res-ref-name>java:app/pirptfe/HeatMapDataAccessJNDI</res-ref-name>
			    <lookup-name>HeatMapDataAccessJNDI</lookup-name>
			</resource-ref>
		</session>
		<session>
			<ejb-name>PMSessionFacadeEJB</ejb-name>
			<resource-ref>
			   <res-ref-name>java:app/pirptfe/PMSessionFacadeJNDI</res-ref-name>
			   <lookup-name>PMSessionFacadeJNDI</lookup-name>
			</resource-ref>
		</session>
		<session>
			<ejb-name>RRMSessionFacadeEJB</ejb-name>
			<resource-ref>
			   <res-ref-name>java:app/pirptfe/RRMSessionFacadeJNDI</res-ref-name>
			   <lookup-name>RRMSessionFacadeJNDI</lookup-name>
			</resource-ref>
		</session>
		<session>
			<ejb-name>FIPMSessionFacadeEJB</ejb-name>
			<resource-ref>
			   <res-ref-name>java:app/pirptfe/FIPMSessionFacadeJNDI</res-ref-name>
			   <lookup-name>FIPMSessionFacadeJNDI</lookup-name>
			</resource-ref>
		</session>
    </enterprise-beans>
</jboss:ejb-jar>
 类似资料:
  • 我是java EE的新手。最近我正在使用bean无状态处理一个项目,但我得到了以下错误 豆子: Servlet: javax.name.nameingException: 在 SerialContext[myEnv={java.name.factory.initial=com.sun.enterprise.name.name.impl.SerialInitContext, java.name.fa

  • 我有一个Web项目,其中有几个EJB在不同的包中。但是我在查找EJB时遇到了问题。 我的目录结构:有两个包索引。作业和索引。ejb。 --包index.job有一个POJOindex.java --包装索引。ejb有一个由@Stateless(name=“indexEJB”,mappedName=“indexEJB”)和@LocalBean定义的ejb --包装索引。ejb还有一个定义为“本地”的

  • 问题:似乎无法通过spring在Webphsere服务器中执行jndi查找EJB3。一直找不到我的jndi名称。我看不出我做错了什么。对于Websphere,您是否必须为jndi名称查找添加不同的内容? 堆栈溢出参考问题-EJB3注入Springbean 版本: Spring版本:4.1.2 WebSphereServer版本:7.0.0.27 Spring错误: 创建名为'myLocalEjb'

  • 在prop service中的必需类中,但serviceCaller在这里显示为null。在这个问题上搜索发现,我们只能在容器管理的类中使用@EJB,而不能在简单的java类中使用。 我已经尝试了一切,但注意似乎是有效的。所以请帮我解决这个问题。

  • 我有一个Spring MVC 3.1.1应用程序,它需要查找部署到WebLogic10.3.5中远程EJB3.0。 其中ABC不同的每一次尝试。 安装和配置Weblogic后,我可以看到部署在控制台中的EJB,这就是我在他的JNDI树中看到的: 每个都是一个树节点,名称为 如您所见,我想在Spring Security3.1.4中设置EJB for login作用域。 这是远程接口的分支: 这是类

  • 我在本地机器上创建了两个liberty实例。我在服务器X中部署了一个包含远程ejb的war模块,并在服务器Y中部署了另一个war模块,它必须从服务器X中远程查找ejb。 下面是从宁静的 Web 服务中查找 ejb 的代码。 当我尝试调用 Web 服务时,我得到以下异常 本地对象不支持 DII 操作 P.S.我已经在两个端口号不同的服务器上启用了ejbRemote功能。 我将查找字符串更改为“cor