我使用Apache Felix和weld,并且有两个类:

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

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


对象是由CDI容器创建的类A,我认为这是在类B中FrameworkUtil.getBundle返回null的原因。也许是classloader问题或类似的问题。当然,当Weld注入它时,我可以从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和其他技术。它们可能是集成在一起的,但是由于它们的技巧在Application Server(只有一个classloader / app)中起作用,因此它们常常引起很多痛苦。

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

10-09 03:27