【问题标题】:Accessing JNDI from within Eclipse OSGI bundle, hosted in WebSphere App Server从托管在 WebSphere App Server 中的 Eclipse OSGI 包中访问 JNDI
【发布时间】:2010-10-12 12:15:58
【问题描述】:

我在访问托管在

中的 OSGI 包中的 JNDI 资源时遇到问题

使用 servlet 桥接的 WebSphere Application Server (WAS)。

创建 JNDI 初始上下文失败。我的代码是:

Hashtable env = new Hashtable();

env.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory");

InitialContext ctx = new InitialContext(env);

这失败了:

javax.naming.NoInitialContextException: 无法使用哈希表中指定的工厂创建 InitialContext {java.naming.provider.url=corbaloc:rir:/NameServiceServerRoot, java.naming.factory.initial=com.ibm.websphere.naming.WsnInitialContextFactory, java.naming.factory.url .pkgs=com.ibm.ws.naming:com.ibm.ws.runtime:com.ibm.iscportal.jndi} [根异常是 java.lang.NullPointerException]

当我直接在 WAR 模块中运行相同的代码(不使用 OSGI)时,它是成功的。因此,我认为问题在于从 OSGI 中访问 JNDI。

我在从 OSGI 中访问 JNDI 时看到了一些对类加载器问题的引用……不确定这是否是我的问题,因为上述异常与类加载没有明确关系,但也许确实如此。无论如何,如果这是问题,我不知道如何解决它!

实际上是否可以从我的 OSGI 模块中访问在 WAS 中设置的 JNDI 和 JDBC 条目?

我的应用程序是一个 Eclipse RAP(Rich Ajax 插件),使用以下描述的 Eclipse WAR 产品工具打包到一个 WAR 文件中:

http://eclipsesource.com/blogs/2010/08/17/equinoxrap-war-deployment-an-end-to-the-pain/

到目前为止,除了 JNDI 访问之外,这工作成功。

非常感谢

大卫

【问题讨论】:

  • 这可能无法解决您的问题(因此它是评论的形式),但我会丢失env.put(context.INITIAL_CONTEXT_FACTORY.... 行。初始上下文工厂类的名称通常已由运行时环境提供。
  • 谢谢,我认为不需要该行是对的,因为无论如何默认情况下都会假定该值,但将其取出并不能解决问题。

标签: jdbc websphere osgi jndi


【解决方案1】:

默认情况下,线程上下文类加载器将用于加载 InitialContextFactory。这可能是(但不能保证)你的包的类加载器。您有两种选择:

  1. 配置 org.osgi.framework.bootdelegation 属性。这可能隐式设置为 sun.,com.sun.,因此您想将其更改为 sun.,com.sun.,com.ibm.websphere.naming .* 我相信这个可以在servlet bridge wars WEB-INF/launch.ini中设置
  2. 您还可以导入 comibm.websphere.naming,这需要您添加到 launch.ini org.osgi.framework.system.packages.extra=com.ibm.websphere.naming

两者都应该工作。 祝你好运。

【讨论】:

    猜你喜欢
    • 2012-07-22
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 2018-08-04
    • 2014-06-05
    相关资源
    最近更新 更多