4

今天我遇到了这个例外

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,我的意思是它是如此明显。谁制造了这些上下文工厂?谁决定我必须使用哪一个,为什么?为什么没有一个列表显示不同目的需要哪一个?似乎有人竭尽全力以最难以理解和最神秘的方式访问人类可能的资源。或者我在这里完全误解了一些东西,或者我缺乏大量的知识。

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

谢谢你们。

4

3 回答 3

3

glassfish 设置jndi.properties供参考:

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.)调用默认构造函数jndi.properties时加载文件。InitialContext在我看来,这比硬编码这些值、创建Properties对象等更可取。

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

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

于 2014-09-25T10:34:15.483 回答
1

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

Meybe 有一个流氓 jndi.properties 文件误导你。

有关更多详细信息,请参阅https://glassfish.dev.java.net/javaee5/ejb/EJB_FAQ.html#StandaloneRemoteEJB

于 2010-08-19T10:49:25.873 回答
0

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

于 2011-01-07T07:05:01.997 回答