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

今天我遇到了这个例外

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

我非常感谢对这个问题的一些启示.

谢谢你们.

解决方法:

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.)我同意这个问题的精神:精细手册中的哪些是指定的?我在手册中看到过一些提及它们,但它们并非都在一个地方 – 至少对于玻璃鱼而言. 4.x glassfish手册仅可通过PDF获取,这无济于事.

上一篇:名称[ejb:..]未在此上下文中绑定.无法在Wildfly中找到[ejb:].]的根本原因javax.naming.NameNotFoundException


下一篇:java – Spring Boot 2.0 JNDI属性值未从application-test属性文件加载