WebSphere:JNDI上下文查找失败

WebSphere:JNDI上下文查找失败,websphere,Websphere,我有以下几点 Context aContext = = new InitialContext(settings); aContext.lookup("java:comp/env/DB2_DB"); 也试过 aContext.lookup("DB2_DB"); web.xml <resource-ref> <description> </description> <res-ref-name>DB2_DB</res-r

我有以下几点

Context aContext = = new InitialContext(settings);
aContext.lookup("java:comp/env/DB2_DB");
也试过

aContext.lookup("DB2_DB");
web.xml

<resource-ref>
    <description>
    </description>
    <res-ref-name>DB2_DB</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Application</res-auth>
    <res-sharing-scope>Shareable</res-sharing-scope>
    <mapped-name>DB2_DB</mapped-name>
</resource-ref>

DB2_数据库
javax.sql.DataSource
应用
可分享
DB2_数据库
然后在我的ibm web bnd.xml中

<resource-ref name="DB2_DB" binding-name="jdbc/DB2DB" />

在Websphere中,我在resources>JDBC>数据源中看到绑定名称

但当我运行我的应用程序时,我看到

由以下原因引起:javax.naming.NameNotFoundException:Context:Node04Cell/Node04/servers/server1,name:DB2_DB:未找到名为DB2_DB的第一个组件。[根异常为org.omg.CosNaming.NamingContextPackage.NotFound:IDL:omg.org/CosNaming/NamingContext/NotFound:1.0]^M


这是WAS6-8.5中的一个端口项目,我不确定ibm-web-bnd.xml的功能,但是您可以尝试两种方法

首先,您可以尝试进行全局查找。尝试:

aContext.lookup("jdbc/DB2DB");
我假设使用数据源配置将数据源命名为“jdbc/DB2DB”


否则,您应该检查应用程序中是否存在。我想ibm-web-bnd.xml应该在正确设置时进行映射。

这个问题已经很老了,我发现还没有公认的答案,所以

以下是实际发生的情况:

  • 代码对
    java:comp/env/DB2\u DB
    执行JNDI查找
  • WebSphere使用WAS专有部署描述符(
    IBMWebBND.xml
    )将应用程序绑定
    DB2_DB
    转换为WebSphereJNDI树中的真实名称(
    jdbc/DB2DB
  • WebSphere查找
    jdbc/DB2DB
    并将其返回给调用者
  • 第一次查找-查找
    java:comp/env/DB2\u DB
    时,您会得到一个
    NameNotFoundException
    。问题不在于查找
    jdbc/DB2DB
    ;在组件的环境中查找
    DB2_DB

    您的部署描述符在我看来还可以,所以我猜您出现问题的原因是:

    Context aContext = new InitialContext(settings);
    
    通过提供一个
    哈希表
    ,您正在构造一个
    InitialContext
    实例。当您需要为构造提供特殊参数时,
    哈希表通常很有用,但是您必须知道何时使用它以及何时避免它。在JavaEE容器中运行的代码,如果需要简单地访问容器的JNDI树,则很少会向InitialContext构造函数提供任何Hashtable

    如果传递到
    InitialContext
    中的
    设置
    包含一个
    PROVIDER\u URL
    键,指示在某个遥远的外部JNDI树上进行查找,我不会感到惊讶

    因此,我将首先取消该参数:

    Context aContext = new InitialContext();
    
    然后再给它一次机会


    如果仍然失败,请使用WebSphere的
    dumpNamespace
    实用程序来清楚地了解WebSphere的JNDI树。

    转储名称空间并在要查找的目标下查找JNDI。如果找不到,则将corbaloc URL更新为目标中给定的URL。因为查找在本地工作,但在群集环境中不工作。我转储了名称空间并标识了corbaloc URL。然后在SIT环境中使用该corbaloc URL

    示例:JMS_HOST在本地是corbaloc::localhost:2809/NameServiceServerRoot,但在集群环境中是JMS_HOST=corbaloc::ABC-DEF-XYZ:9810/NameServiceServerRoot


    这就解决了我的问题。

    ibm-web-bnd.xml是从本地资源名称到容器内JNDI引用的映射。我想这是查找“DB2_DB”的例外。查找“java:comp/env/DB2_DB”的例外情况是什么?您解决了这个问题吗?我只是遇到了一个类似的问题,对我来说这只是一个简单的输入错误。我忘记了我做了什么(如果我做了)来解决这个问题检查消息引擎是否启动这对我来说是一个启动消息服务的解决方案检查如果SIB已经启用,那么你只需要重新启动它