2016-12-22 9 views
3

Я перемещаюсь из org.apache.felix.scr аннотации к org.osgi.service.component аннотации. У меня есть набор компонентов, которые наследуются от общего абстрактного класса. В случае felix я могу использовать аннотацию @Component с опцией componentAbstract=true над суперклассом, а затем использовать аннотацию @Reference в суперклассе. Я не могу найти, как перенести это в аннотации osgi.Абстрактные компоненты через org.osgi.service.component аннотации

Можно ли использовать аннотации компонентов в суперклассе компонента? И если да, то каким образом это подходящий способ обработки свойств и генерации метатипов?

Итак, что я ищу, это что-то вроде этого

/* No component definition should be generated for the parent, as it is 
    abstract and cannot be instantiated */ 
@Component(property="parent.property=parentValue") 
public abstract class Parent { 
    @Reference 
    protected Service aService; 

    protected activate(Map<String,Object> props) { 
    System.out.println("I have my parent property: "+props.get("parent.property")); 

    @Override 
    public abstract void doSomething(); 
} 

/* For this class, the proper Component definition should be generated, also 
    including the information coming from the annotations in the parent */ 
@Component(property="child.property=childValue") 
public class Child extends Parent { 

    @Activate 
    public activate(Map<String,Object> props) { 
    super.activate(props); 
    System.out.println("I have my child property: "+props.get("child.property")); 
    } 

    public void doSomething() { 
    aService.doSomething(); 
    } 
} 

ответ

6

По умолчанию БНД не будет обрабатывать DS аннотаций в родительских классах. Вы можете изменить это с помощью -dsannotations-options: inherit, но, пожалуйста, см. http://enroute.osgi.org/faq/ds-inheritance.html, почему вы не должны!

+1

Спасибо за ссылку. Объяснение ясно, но действительно фокусируется на родителях в разных связках. В моем случае оба класса являются частью одного и того же пакета, поэтому аргументы действительно не выполняются. –

+0

Однако я переписал абстрактный класс в заводский компонент и сделаю адаптеры, которые будут выполнять всю специализированную реализацию из дочернего класса. –

+1

С Maven Bundle Плагин можно использовать следующую конфигурацию: '<конфигурации> < _dsannotations-опции> наследует ' – Puce