我使用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/