java - OSGi + Weld : FrameworkUtil getBundleContext() returns null

标签 java osgi cdi apache-felix weld

我使用 Apache Felix 和 Weld ,我有两个类:

@ApplicationScoped
class A {
  private B b= new B();
}

class B {
  private void foo(){
    BundleContext bc= FrameworkUtil.getBundle(this.getClass()).getBundleContext();
  }
}

对象是 A 类由 CDI 容器创建的,我认为这就是 B 类 FrameworkUtil.getBundle 返回 null 的原因。也许是类加载器问题或类似的问题。当然,当 Weld 注入(inject)它时,我可以从 A 类获取对包上下文的引用。但我不想将此引用保留在 A 内并将其传递给任何其他类。我可以获取 B 内的捆绑上下文的引用(而不从 A 获取)吗?我在B尝试过:

@Inject
BundleContext bundleContext;

但是没有成功。这可能很重要 - 这些类位于不同的包中。

最佳答案

对象实例可能具有 CDI 容器在运行时由其自己的自定义类加载器创建的类型(通过创建 A 的子类)。

而不是使用调用

BundleContext bc= FrameworkUtil.getBundle(this.getClass()).getBundleContext();

尝试打电话

BundleContext bc= FrameworkUtil.getBundle(A.class).getBundleContext();

如果类型 A 由包的 ClassLoader 加载,这应该可以工作。

顺便说一句:我建议不要在 OSGi 中使用 Weld、CDI 和其他技术。它们可能是集成的,但由于它们在应用程序服务器(只有一个类加载器/应用程序)中工作的技巧,它们经常会造成很多痛苦。

关于java - OSGi + Weld : FrameworkUtil getBundleContext() returns null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29714028/

相关文章:

java - Webflow 与 Angular 还是两者兼而有之?

java - CDI:来自同一 bean 的非拦截方法的拦截方法嵌套调用 - 应该调用吗?

osgi - 如何在 OSGi 中使用多值(数组)属性?

java - 查找使用通配符属性注册的 OSGI 服务

java - Injectind 在运行时通过 CDI 自动实现

java - Quarkus 不以编程方式选择 bean

java - 设置简单 RMI 服务器时出现问题

设置路径后仍无法识别javac

java - 如何在窗口中输出 ArrayList?

java - Amdatu 多部分表单 @FormParam 始终为 null