为了使用 JNDI,您需要指定java.naming.factory.initial
不知怎的,就像错误消息所说的那样。
有多种方法可以做到这一点:
您可以通过以下方式将其指定为 Glassfish 中的系统属性server (Admin server)
-> Properties
或者,您可以在 HashTable 中指定它并将其传递给构造函数InitialContext
:
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.enterprise.naming.SerialInitContextFactory");
Context ctx = new InitialContext(env);
如果你使用Spring,你也可以这样做:
<bean id="myJndiTemplate" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">com.sun.enterprise.naming.SerialInitContextFactory</prop>
<prop key="java.naming.factory.url.pkgs">com.sun.enterprise.naming</prop>
<prop key="java.naming.factory.state">com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl</prop>
</props>
</property>
</bean>
See http://docs.oracle.com/javase/jndi/tutorial/beyond/env/context.html http://docs.oracle.com/javase/jndi/tutorial/beyond/env/context.html了解更多信息。
就实际值而言,上面的 Spring 配置是我们实际使用的Glassfish
。我们不指定提供商 url 或凭据。
我不认为这与创建 ldap 领域真正相关,但 Glassfish 可能会使用 JNDI 来查找领域。
Edit:
我想我可能明白问题是什么,您正在尝试从客户端访问远程类。有了这个假设,您可以使用 Spring 和 JndiTemplate 来完成此操作。假设服务器提供了正确的 EJB 类,请在客户端执行此操作:
为 JndiTemplate 创建一个 bean:
<bean id="myJndiTemplate" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">com.sun.enterprise.naming.SerialInitContextFactory</prop>
<prop key="org.omg.CORBA.ORBInitialHost">${servername}</prop>
<prop key="org.omg.CORBA.ORBInitialPort">${jndiport}</prop>
</props>
</property>
</bean>
然后您可以使用这个 bean 来查找服务器上的内容。如果您想更进一步,调用您自己的远程 EJB 类,您也可以这样做:
<bean id="ejbProxy"
class="org.springframework.ejb.access.SimpleRemoteStatelessSessionProxyFactoryBean"
abstract="true">
<property name="refreshHomeOnConnectFailure" value="true"/>
<property name="cacheHome" value="true"/>
<property name="lookupHomeOnStartup" value="true"/>
<property name="resourceRef" value="false"/>
<property name="jndiTemplate" ref="mySpringTemplate"/>
</bean>
然后将 bean 定义为:
<bean id="someRemoteService" parent="ejbProxy">
<property name="jndiName"
value="com.company.service.MyRemoteService"/>
<property name="businessInterface"
value="com.company.service.MyRemoteService"/>
</bean>
您可以像常规 bean 一样注入它,对它的任何调用都将发送到服务器。