在执行 jndi 查找时,如何找出应该使用的 SerialContextProvider?

Posted

技术标签:

【中文标题】在执行 jndi 查找时,如何找出应该使用的 SerialContextProvider?【英文标题】:How do I find out what SerialContextProvider I should use when performing a jndi lookup? 【发布时间】:2010-08-19 10:26:25 【问题描述】:

今天我遇到了这个例外

Caused by: javax.naming.NamingException: Unable to acquire SerialContextProvider for SerialContext  [Root exception is java.lang.NullPointerException]
        at com.sun.enterprise.naming.impl.SerialContext.getProvider(SerialContext.java:276)
        at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:430)
        ... 23 more

我试图远程访问一个 ejb,有问题的代码是

Context c = new InitialContext();

我以前见过这个异常并修复它,但不记得我是如何做到的。我知道我必须为初始、上下文 url 和服务提供者或类似的东西设置一些环境变量。

事实上,我在上次遇到此问题时设法找到了用于解决此问题的代码,如下所示。

Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory");
env.put(Context.PROVIDER_URL, "localhost:1099");
Context c = new InitialContext(env);

我的问题是,如何找出要使用的初始上下文工厂?我已经为我们的数据库编写了一个在 glassfish v3 上运行的 ejb 模块,我从来没有得到任何暗示我当然应该使用com.sun.enterprise.naming.SerialInitContextFactory,我的意思是它是如此明显。谁制造了这些上下文工厂?谁决定我必须使用哪一个,为什么?为什么没有一个列表显示不同目的需要哪一个?似乎有人竭尽全力以最难以理解和最神秘的方式访问人类可能的资源。或者我在这里完全误解了一些东西,或者我缺乏大量的知识。

我非常感谢您对这个主题的一些启发。

谢谢大家。

【问题讨论】:

【参考方案1】:

jndi.properties 的 glassfish 设置供参考:

java.naming.factory.initial=com.sun.enterprise.naming.SerialInitContextFactory
java.naming.factory.url.pkgs=com.sun.enterprise.naming
java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl
Context.SECURITY_PRINCIPAL=user1
Context.SECURITY_CREDENTIALS=pass123
org.omg.CORBA.ORBInitialHost=localhost
org.omg.CORBA.ORBInitialPort=3700

1.) 调用默认的InitialContext 构造函数时会加载jndi.properties 文件。在我看来,这比硬编码这些值、创建Properties 对象等更可取。

2.) 这些连接参数适用于本地运行的 Glassfish。我从各种来源拼凑起来。

3.) 我同意这个问题的精神:这些在精美的手册中是在哪里指定的?我在手册中看到过一些提及它们,但它们并不都在一个位置——至少对于 glassfish 而言。 4.x glassfish 手册只能通过 PDF 获得,这无济于事。

【讨论】:

这两个 CORBA 属性是默认值 - 如果值与显示的值不同,您只需指定它们。另外,我认为只有在从远程主机访问 Glassfish 时才需要安全属性?【参考方案2】:

通常,JNDI 在类路径中的 jndi.properties 文件中查找其配置。

我可能有一个流氓 jndi.properties 文件误导了你。

更多详情见https://glassfish.dev.java.net/javaee5/ejb/EJB_FAQ.html#StandaloneRemoteEJB

【讨论】:

感谢您的提示,我现在已经摆脱了 INITIAL_CONTEXT_FACTORY 变量,它稍微简化了我的代码,但正如您提供的链接中所述,一些供应商确实需要将属性引导到 InitialContext(args),那么在我使用的是 glassfish 以外的供应商的情况下,我将如何找出要设置的属性,而当我们讨论这个主题时,什么是供应商?谢谢皮尔斯 供应商是“销售”产品的组织。对于 Sun/Oracle 的 glassfish,对于 JBoss,它是 Redhat 等等......找到这些参数是一场噩梦。对于 JBoss,它在手册中,但我敢于让你找到它。最好的方法是查看示例目录并查看其中使用了什么。【参考方案3】:

如果 jndiContext.lookup(???) 指定正确,请检查。

【讨论】:

这将如何导致问题?应该如何正确指定?

以上是关于在执行 jndi 查找时,如何找出应该使用的 SerialContextProvider?的主要内容,如果未能解决你的问题,请参考以下文章

当jboss 7服务器启动时,在jndi查找中获取appname

j2se jndi

如何在使用 JNDI 的应用程序中查找数据源 [重复]

如何绕过karaf中的默认aries jndi查找

如何从 Web 容器外部查找 JNDI 数据源?

如何在 Coherence 12.2.1 中启用缓存服务器 JNDI 查找支持?