2015-05-30 5 views
0

Я использую javase и решение osgi (felix) + cdi (сварка) + paxcdi. У меня есть два пучка A и B. Bundle B - это расслоение lib.CDI + OSGI: пакетные пакеты scope

В комплекте A У меня есть один класс и один пакет.

package com.example.firstpackage; 
import com.example.secondpackage.Class2; 
public class Class1{ 
    @Inject 
    private Class2 class2; 
} 

В расслоении B У меня есть два класса и два пакета

package com.example.secondpackage; 
import com.example.thirdpackage.Class3; 
public class Class2{ 
    @Inject 
    private Class3 class3; 
} 

и

package com.example.thirdpackage; 
public class Class3{ 
    .... 
} 

я установить и запустить обе связки.

Проблема - pax (или сварка) для инъекций в классах пучков A сканирует только те пакеты, которые импортируются для классов IN bundle A. В моем примере - CDI для инъекций в Class1 Class2 сканирует com.example.secondpackage пакета B. Однако он будет генерировать исключение, поскольку Class2 нуждается в Class3, но com.example.thirdpackage не сканируется для пакета A (поскольку он не импортируется !!!). com.example.thirdpackage сканируется только для пакета B, но, как я понимаю, у каждого пакета для cdi есть своя область. Как это исправить?

ответ

4

Если вы не изменяете дизайн системы, все, что вы можете сделать, это экспортировать thirdpackage из B и импортировать его в A.

Для достижения лучшей инкапсуляции, вы можете вынесешь интерфейс IClass2 сервиса, реализованный Class2, делаю этим класс @OsgiServiceProvider и использовать

@Inject @OsgiService 
private IClass2 class2; 

в Class1.

+0

+1 для альтернативного предложения, поскольку исходный дизайн может быть хорошим, используя CDI в JEE, но окончательно не способ сделать это в OSGi. –

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