2016-12-22 2 views
3

Ich bin von org.apache.felix.scr Annotationen zu org.osgi.service.component Annotationen migrieren. Ich habe eine Reihe von Komponenten, die von einer gemeinsamen abstrakten Klasse erben. Im Felix-Fall kann ich eine @Component Annotation mit der Option componentAbstract=true für die Superklasse verwenden und dann @Reference Annotation in der Superklasse verwenden. Ich kann nicht finden, wie man dies zu OSGI Annotationen migriert.Abstrakte Komponenten über org.osgi.service.component Annotationen

Ist es möglich, Component Annotations in einer Superklasse einer Komponente zu verwenden? Und wenn ja, was ist dann der richtige Weg, um die Eigenschaften und die Metatypgenerierung zu handhaben?

Also, was ich suche, ist so etwas wie dies

/* 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(); 
    } 
} 

Antwort

6

standardmäßig BND nicht DS Anmerkungen in übergeordneten Klassen verarbeiten. Sie können dies mit -dsannotations-options: inherit ändern, aber bitte sehen Sie http://enroute.osgi.org/faq/ds-inheritance.html warum sollten Sie nicht!

+1

Danke für den Link. Die Erklärung ist klar, konzentriert sich aber auf die Eltern in verschiedenen Bündeln. In meinem Fall sind beide Klassen Teil desselben Bündels, also sind die Argumente nicht wirklich gültig. –

+0

Allerdings werde ich die abstrakte Klasse in eine Factory-Komponente umschreiben und Adapter herstellen, die alle spezialisierten Implementierungen von der untergeordneten Klasse ausführen. –

+1

Mit dem Maven Bundle Plugin können Sie die folgende Konfiguration verwenden: ' <_dsannotations-Optionen> inherit ' – Puce

Verwandte Themen