javax.naming.NoInitialContextException:无法使用哈希表中指定的工厂创建InitialContext

时间:2010-11-14 15:17:30

标签: java java-ee websphere jndi

我有一个小程序,它只是在非托管环境中创建初始上下文,即在容器外部。我一直在使用Websphere 7.0。 我编写了以下程序来与使用corba url

在WAS 7上运行的应用程序建立连接
package snippet;

import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.InitialContext;

public class test {
    public static void main(String[] args) {
        try {
            // create initial context
            Hashtable env = new Hashtable();
            env.put(Context.INITIAL_CONTEXT_FACTORY,
                    "com.ibm.websphere.naming.WsnInitialContextFactory");
            env
                    .put(Context.PROVIDER_URL,
                            "corbaloc:iiop:1.0@x1devapp63.dev.freightliner.com:2809/NameService");

            InitialContext ctx = new InitialContext(env);

            System.out.println(ctx);
        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }
} 

我创建了runnable jar并使用下面给出的shell脚本执行

#!/bin/sh

WAS_ROOT_PATH=/application/WebSphere/AppServer
SCHEDULER_JAR=/application/apps/JobScheduler/testJNDI.jar
SCHEDULE_FILE=/application/apps/JobScheduler/schedule.xml
. "$WAS_ROOT_PATH"/bin/setupCmdLine.sh
CLASSPATH="$MQLIB":"$WAS_CLASSPATH"
"$JAVA_HOME"/bin/java -classpath "$CLASSPATH" -jar "$SCHEDULER_JAR"

跑步,我一直面临着异常,

$ testJNDI.sh
javax.naming.NoInitialContextException: Failed to create InitialContext using factory specified in hashtable {java.naming.provider.url=corbaloc:iiop:1.0@x1devapp63.dev.freightliner.com:2809/NameService, java.naming.factory.initial=com.ibm.websphere.naming.WsnInitialContextFactory} [Root exception is java.lang.NullPointerException]
        at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:243)
        at javax.naming.InitialContext.initializeDefaultInitCtx(InitialContext.java:327)
        at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:357)
        at javax.naming.InitialContext.internalInit(InitialContext.java:295)
        at javax.naming.InitialContext.<init>(InitialContext.java:212)
        at snippet.test.main(test.java:19)
Caused by: java.lang.NullPointerException
        at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:235)
        ... 5 more
$ 

我遇到了上述问题,但我无法理解为什么会发生这种情况。

请尽量让我从上面解决问题。

3 个答案:

答案 0 :(得分:6)

不要忘记将thinclient-jar包含在buildpath中。 您将需要它们从独立客户端进行jndi查找。

%WAS_HOME%/ runtimes是他们可以找到的地方。

http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.websphere.nd.multiplatform.doc/info/ae/ae/ccli_standaloneclient.html

答案 1 :(得分:1)

提供程序URL可帮助您识别连接到名称空间的服务器和根@。

例如,如果要连接到Cell Persisent根目录,则应将Provider_URL指定为:

env.put(Context.PROVIDER_URL,       “corbaloc:IIOP:myhost.mycompany.com:2809 / NameServiceCellPersistentRoot”);

服务器根NameServiceServerRoot Cell Persistent Root NameServiceCellPersistentRoot Cell Root NameServiceCellRoot 节点根NameServiceNodeRoot

默认对象键为:“ NameService ”,因此如果要连接到默认位置,则不需要在URL中。

此外,堆栈跟踪中是否还有其他任何其他信息?

同样来自客户端计算机的是DNS名称: x1devapp63.dev.freightliner.com 可解析?

这是WAS服务器用来标识自己的名称吗?安装WAS时,您是否指定了主机名,并且该名称是否与此名称匹配?

您是否可以在与WAS服务器相同的计算机上运行相同的计算机并使用 localhost ,并查看错误是否相同。

我正在考虑可能导致问题的潜在网络相关错误。

请查看有关帮助您连接到根上下文的各种值的信息。

http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.websphere.nd.multiplatform.doc/info/ae/ae/rnam_example_prop5.html

HTH Manglu

答案 2 :(得分:0)

您确定提供商网址是否正确?根据{{​​3}}(WAS Express 6)或this one(WAS 8)等各种示例(找不到WAS 7的参考但看起来事情没有改变),使用的代码具有WAS JNDI实现的CORBA对象URL描述如下:

  

使用CORBA对象URL

     

此示例显示CORBA对象URL。

...
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
...
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
     "com.ibm.websphere.naming.WsnInitialContextFactory");
env.put(Context.PROVIDER_URL, "corbaloc:iiop:myhost.mycompany.com:2809");
Context initialContext = new InitialContext(env);
...

不知道这是否会有所帮助。