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. Они могут быть интегрированными, но они часто причиняют много боли из-за уловок, которые их уловки работают на серверах приложений (где есть только один загрузчик классов / приложение).

Другие вопросы по тегам