2015-04-18 2 views
0

Я использую Apache Felix и сварной шов и у меня есть два класса:OSGi + Weld: FrameworkUtil getBundleContext() возвращает нуль

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

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

Объект класса А создается КДИ контейнером, и я думаю, что причина того, что в классе B FrameworkUtil.getBundle возвращает null. Может быть, проблема с загрузчиком или что-то в этом роде. Конечно, я могу получить ссылку на контекст пакета из класса A, поскольку Weld вводит его. Но я не хочу держать эту ссылку внутри A и передавать ее другим классам. Могу ли я получить ссылку на контекст связки внутри B (не беря его из A)? Я попытался в B:

@Inject 
BundleContext bundleContext; 

Но это не сработало. Это может быть важно - эти классы находятся в разных пучках.

+0

Что заставляет вас поверить, что CDI и OSGi будут работать вместе из коробки? Они этого не делают, и поэтому существует проект под названием Pax CDI для обеспечения интеграции. –

+0

@hwellmann Я знаю о paxcdi, так как это невозможно использовать сварить в javase без него. –

ответ

2

Возможно, экземпляр объекта имеет тип, созданный контейнером CDI во время выполнения его собственным пользовательским загрузчиком классов (путем создания подкласса A).

Вместо вызова

BundleContext bc= FrameworkUtil.getBundle(this.getClass()).getBundleContext(); 

попробовать призывающую

BundleContext bc= FrameworkUtil.getBundle(A.class).getBundleContext(); 

В случае типа А загружается ClassLoader пучка, это должно работать.

Btw: Я рекомендую не использовать Weld, CDI и другие технологии в OSGi. Они могут быть интегрированы, но они часто вызывают много боли из-за трюков с их трюками, которые работают на серверах приложений (там, где есть только один загрузчик классов/приложение).

+0

Странно, что FrameworkUtil.getBundle (this.getClass()) возвращает пакет, но FrameworkUtil.getBundle (this.getClass()). GetBundleContext возвращает значение null. Как это объяснить? –

+0

Из javadoc BundleContext: «Объект BundleContext будет создан и предоставлен пакету, связанному с этим контекстом, когда он будет запущен с использованием метода BundleActivator.start (org.osgi.framework.BundleContext)». На практике bundle.getBundleContext() возвращает значение null до того, как пакет получит состояние STARTING. –

+0

Это очень странно. Потому что у меня есть два пучка A и B. Я устанавливаю их в порядке A и B и начинаю A и B. Пакет содержит lib. B содержит программу. И я получаю null, когда пытаюсь получить getBundle (classFromB) .getBundleContext(); –

Смежные вопросы