OSGi + Weld: FrameworkUtil getBundleContext() возвращает ноль
Я использую Apache Felix и шва, и у меня есть два класса:
@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. Может быть, проблема с загрузчиком классов или что-то вроде этого. Конечно, я могу получить ссылку на контекст пакета из класса A, как это делает Weld. Но я не хочу хранить эту ссылку внутри А и передавать ее любым другим классам. Могу ли я получить ссылку на контекст пакета внутри B (не беря его из A)? Я пробовал в B:
@Inject
BundleContext bundleContext;
Но это не сработало. Это может быть важно - эти классы находятся в разных связках.
1 ответ
Вероятно, экземпляр объекта имеет тип, который контейнер CDI создал во время выполнения своим собственным пользовательским загрузчиком классов (путем создания подкласса A).
Вместо использования звонка
BundleContext bc= FrameworkUtil.getBundle(this.getClass()).getBundleContext();
попробуйте позвонить
BundleContext bc= FrameworkUtil.getBundle(A.class).getBundleContext();
В случае, если тип A загружается ClassLoader пакета, это должно работать.
Кстати: я рекомендую не использовать Weld, CDI и другие технологии в OSGi. Они могут быть интегрированными, но они часто причиняют много боли из-за уловок, которые их уловки работают на серверах приложений (где есть только один загрузчик классов / приложение).