今天我遇到了这个例外
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
,我的意思是它如此明显。谁制作这些上下文工厂?谁决定我要使用哪一个?为什么?为什么没有列表显示出于不同目的需要哪一个?似乎有人不顾一切地制作了一种最难以理解和神秘的方法来访问人类可能的资源。或者我在这里完全误解了一些东西,或者缺乏大量的知识。
我非常感谢对这个问题的一些启示。
谢谢大家。
答案 0 :(得分:3)
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。)调用默认的jndi.properties
构造函数时,会加载InitialContext
文件。在我看来,最好是对这些值进行硬编码,创建Properties
对象等等。
2。)这些连接参数适用于本地运行的Glassfish。我从各种来源拼凑了这些。
3。)我同意这个问题的精神:精细手册中的哪些是指定的?我在手册中看到过一些提及它们,但它们并非都在一个地方 - 至少对于玻璃鱼而言。 4.x glassfish手册仅可通过PDF获取,这无济于事。
答案 1 :(得分:1)
通常,JNDI在类路径的jndi.properties文件中查找其配置。
Meybe有一个流氓jndi.properties文件误导你。
有关详细信息,请参阅https://glassfish.dev.java.net/javaee5/ejb/EJB_FAQ.html#StandaloneRemoteEJB
答案 2 :(得分:0)
检查是否正确指定了jndi Context.lookup(???)。