【问题标题】:Remote JNDI lookup using only Java jars (without thin clients of WebLogic/Jboss etc)仅使用 Java jar 进行远程 JNDI 查找(没有 WebLogic/Jboss 等瘦客户端)
【发布时间】:2017-04-19 19:07:58
【问题描述】:

我想从 Spring 或独立 Java 执行远程 EJB 查找,因为我的应用程序作为独立执行,我不能使用任何供应商 jar,如 WebLogic/Jboss 瘦客户端。如何仅使用 Java 规范 jar 或 Spring 执行远程 EJB 查找?

我尝试使用javax.naming.spi.InitialContextFactory,但在运行时出现以下错误。

init 方法调用失败;嵌套异常是 javax.naming.NoInitialContextException:无法实例化类:javax.naming.spi.InitialContextFactory [根异常是 java.lang.InstantiationException:javax.naming.spi.InitialContextFactory]

【问题讨论】:

标签: java spring ejb-3.0


【解决方案1】:

通过使用 spring,您可以通过以下 java config 来做到这一点:

@Configuration
public class EJBConfig {
    @Bean
    public LocalStatelessSessionProxyFactoryBean fooService(){
        LocalStatelessSessionProxyFactoryBean factory = new LocalStatelessSessionProxyFactoryBean();
        factory.setBusinessInterface(FooService.class);
        factory.setJndiName("java:global/my_ear/my_jar/FooServiceBean");
        return factory;
    }
}

或者使用xml

<bean id="fooService"
        class="org.springframework.ejb.access.LocalStatelessSessionProxyFactoryBean">
    <property name="jndiName" value="java:global/my_ear/my_jar/FooServiceBean"/>
    <property name="businessInterface" value="com.company.ejb.FooService"/>
</bean>

【讨论】:

  • 使用这个我只能连接到本地EJB,但我的情况是查找远程EJB(这个ejb部署在远程服务器的其他容器中),在这种情况下如何获取InitialContext,哪个java包我现在应该使用 .naming.factory.initial 吗?
  • 类似地,为了访问远程无状态会话 Bean,必须使用类 SimpleRemoteStatelessSessionProxyFactoryBean 而不是 LocalStatelessSessionProxyFactoryBean。属性“jndiName”和“businessInterface”仍然适用。
  • shi,它不起作用,因为 spring 不知道要连接哪个服务器并加载上下文,因为我们没有加载任何上下文。 Spring 应该让 jndiProperties 加载 environment-ref 并将此引用用于 jee:lookup。如果我使用 weblogic 上下文工厂,它正在工作,但根据项目规范,我不能使用任何相关的供应商,除非它默认来自 java 或 spring。
  • 仅供参考:- 如果我只是使用 Spring Remote 无状态 bean,我会得到以下异常 spring 不是 ejb 查找的提供者,它应该知道环境属性,一旦创建上下文,然后 spring 在内部执行ejb查找获取业务接口。调用 init 方法失败;嵌套异常为 javax.naming.NoInitialContextException:需要在环境或系统属性中指定类名,或作为小程序参数,或在应用程序资源文件中:java.naming.factory.initial
  • 感谢这里的 dzone 链接,它加载了上下文:- 这是 openEJB jar,它既不是来自 java 也不是 spring,我们是否有任何来自 java 或 spring 的提供程序实现?属性 env = new Properties(); env.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.RemoteInitialContextFactory"); env.put(Context.PROVIDER_URL, "ejbd://localhost:4201"); ctx = new InitialContext(env);
猜你喜欢
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
  • 2014-01-01
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多