- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 felix 和 pax-cdi 0.13 并焊接。我在 B 中有两个 bundle A。在 bundle A 中,我有 BundleTracker 和定制器,在 bundle B 中我有 CDI beans。所以我想在bundle tracker中使用bean管理器从bundle B获取cdi beans。所以我在定制器中有方法:
@Override
public Object addingBundle(Bundle bundle, BundleEvent event) {
String marker = (String) bundle.getHeaders().get("Some-Marker");
if (marker != null) {
try {
//1 we get CdiContainerFactory
BundleContext thisBundleContext=FrameworkUtil.getBundle(this.getClass()).getBundleContext();
ServiceReference<?> sr = thisBundleContext.getServiceReference(CdiContainerFactory.class.getName());
CdiContainerFactory cdiContainerFactory = (CdiContainerFactory) thisBundleContext.getService(sr);
if (cdiContainerFactory==null){
System.out.println("Cdi container factory is null");
}else{
System.out.println("Cdi container factory is not null");
}
//2 we get BeanManager from CdiContainerFactory
Class<?> klass = bundle.loadClass("com.temp.Temp");
BeanManager beanManager = cdiContainerFactory.getContainer(bundle).getBeanManager();
Bean<?> bean = (Bean<?>)beanManager.resolve(beanManager.getBeans(klass));
Object temp= beanManager.getReference(bean, bean.getBeanClass(), beanManager.createCreationalContext(bean));
} catch (ClassNotFoundException ex) {
Logger.getLogger(ExtenderBundleTracker.class.getName()).log(Level.SEVERE, null, ex);
}
}
return bundle;
}
要注册捆绑跟踪器,我使用以下代码:
bundleTracker=new BundleTracker<>(context, Bundle.ACTIVE, new MyCustomizer());
上面的代码有效。但不总是。我有时间问题。我总是得到 Cdi 容器工厂不为空
,但是以下行
BeanManager beanManager = cdiContainerFactory.getContainer(bundle).getBeanManager();
有时会抛出 NullPointerException。正如我所想,当 Bundle B 变为 Activity 状态时,CDI 容器仍未准备好。怎么解决这样的问题呢?
最佳答案
有时无法找到 Bean 管理器的原因是 CDI 容器也是由 PAX-CDI bundle 中的 bundle 监听器(异步)创建的。这意味着您可能会遇到竞争条件,因为在调用捆绑监听器时可能会或可能不会创建容器。
当使用 PAX-CDI 时,我不建议尝试访问 Bean 管理器,而是将您需要的 Bean 导出为 OSGi 服务(Bean 上的 @OsgiServiceProvider 注释)并通过 ServiceTracker
跟踪该服务。 。如果由于 bean 的范围而无法做到这一点,您始终可以在容器中创建一个单独的工厂模式 bean,为您完成 bean 创建工作并将其导出为一项服务。
关于java - PAX-CDI : CdiContainerFactory and BundleTracker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41259197/
OSGi 企业规范定义了两种跟踪方式:按服务或按捆绑。 这两种方式有什么区别?在什么情况下,应该使用一种方法而不是另一种方法? 谢谢 最佳答案 取决于您愿意跟踪的内容。 BundleTracker 跟
我使用 felix 和 pax-cdi 0.13 并焊接。我在 B 中有两个 bundle A。在 bundle A 中,我有 BundleTracker 和定制器,在 bundle B 中我有 CD
我正在像这样跟踪 OSGi 包: BundleTracker bundleTracker = new BundleTracker<>(context, Bundle.ACTIVE, new B
我是一名优秀的程序员,十分优秀!