2013-06-28 3 views
5

Die Adobe AEM-Software bietet mehrere Klassen, die eine Apache Sling Ressource nehmen und es in einer anderen Klasse anpassen, wie so:Wie Implementieren einer benutzerdefinierten AdapterFactory for Sling Resource?

Page page = resource.adaptTo(Page.class); 

diese Syntax mit Klassen zu verwenden, die Sie erstellen und steuern diese einfach Umsetzung unten kocht die Adaptable Schnittstelle.

Wenn Sie jedoch eine Ressource für die Anpassung an Ihre neue benutzerdefinierte Klasse aktivieren möchten, müssen Sie die AdapterFactory-Schnittstelle implementieren und in OSGI registrieren.

Dies ist, wie die Adobe website beschreibt es:

Durch eine Adapterfactory, die beliebige Objekte abbilden. Die Objekte müssen weiterhin die Schnittstelle Adaptable implementieren und müssen SlingAdaptable (das den Aufruf von adaptTo an einen zentralen Adaptermanager weiterleitet) erweitern. Dies ermöglicht Hooks in den AdaptTo-Mechanismus für vorhandene Klassen, z. B. Ressource.

Ich bin durch den Code SlingScriptAdapterFactory gegangen, aber letztlich verbinde ich die Punkte hier nicht. Grundsätzlich möchte ich dies tun:

MyClass myClass = Resource.adaptTo(MyClass.class); 

erstelle ich eine Klasse, die implementiert und Adapterfactory einfach implementieren es mit dem Paket erwartet, dass Sling wird es nur nach Art finden oder ist es mehr?

Antwort

4

Hier ist ein wenig besser Dokumentation https://sling.apache.org/documentation/the-sling-engine/adapters.html

So sollten Sie die Adaptable-Schnittstelle implementieren, wie Sie bereits beschrieben. Dann erstellen Sie eine richtig kommentierten Adapterfactory:

@Component 
@Service(value=org.apache.sling.api.adapter.AdapterFactory.class) 
@Properties({ 
    @Property(name = "adaptables", value = { "org.apache.sling.api.resource.Resource" }), 
    @Property(name = "adapters", value = { "org.sling.MyClass" }) 
}) 
public class MyAdapterFactory implements AdapterFactory{ 
    public <AdapterType> AdapterType getAdapter(final Object adaptable, Class<AdapterType> type){ 
      return new MyClassAdapter(adaptable); 
    }  
} 
+0

Ich konnte dies bestätigen und es war genau das, was ich brauchte. Ich hatte nicht verstanden, dass die Kommentare auf der Apache-Site die notwendigen SCR-Annotationen zur Registrierung meines Adapters skizzierten [https://felix.apache.org/documentation/subprojects/apache-felix-maven-scr-plugin/scr-annotations. html] Jetzt muss ich nur herausfinden, wie man die Annotationseigenschaft des Adapters als eine Sammlung von Klassen ausdrückt, die der Adapter unterstützt. Vielen Dank! – jedatu

3

Bitte beachte, dass ich habe auf eine einfachere Art und Weise arbeiten Sling Adapter zu schaffen, durch Methoden mit einer neuen @Adapter Anmerkung Anmerkungen versehen, wie in

@Component 
    @Service 
    public class C implements AdapterMethodsProvider { 
    @Adapter 
    public CustomerRecord convert(Resource r) { ... } 

    @Adapter 
    public Person adaptToPerson(Resource r) { ... } 
    } 

See https://issues.apache.org/jira/browse/SLING-2938 für Details, aber beachten Sie, dass dies noch nicht einmal in der Sling-Trunk ist, so dass es einige Zeit dauern wird, bevor es veröffentlicht und in AEM/CQ verfügbar ist.

+0

Dies wäre bequem. Ich werde mal schauen. Es scheint in Übereinstimmung mit der Arbeit zu sein, die Teil von Slice [http://www.cognifide.com/blogs/cq/make-your-cq-life-easier-with-slice/] ist, die darauf abzielt, Anmerkungen zu verwenden, um POJO zu kartieren Eigenschaften zu Jcr-Eigenschaften. – jedatu

Verwandte Themen