2013-06-28 35 views
5

Il software Adobe AEM fornisce diverse classi che possono prendere uno Sling risorse apache e adattarlo ad un'altra classe in questo modo:Come implementare un AdapterFactory personalizzato per Sling Resource?

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

Per utilizzare questa sintassi con le classi che autore e controllo questo si riduce a semplice attuazione del Interfaccia Adaptable.

Tuttavia, se si desidera abilitare una risorsa per adattare la nuova classe personalizzata, sembra che sia necessario implementare l'interfaccia AdapterFactory e registrarla in OSGI.

Questo è come il Adobe website lo descrive:

Con AdapterFactory, che può mappare oggetti arbitrari. Gli oggetti devono ancora implementare l'interfaccia adattabile e devono estendere SlingAdaptable (che passa la chiamata adattTo a un gestore adattatore centrale). Ciò consente agganci nel meccanismo adaptTo per classi esistenti, ad esempio Risorsa.

ho camminato attraverso il codice SlingScriptAdapterFactory, ma alla fine non mi unire i punti qui. Fondamentalmente io voglio fare questo:

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

si crea una classe che implementa AdapterFactory e semplicemente distribuirlo con il pacchetto in attesa che Sling sarà solo trovarlo per tipo o c'è di più?

risposta

4

Qui è un po 'meglio la documentazione https://sling.apache.org/documentation/the-sling-engine/adapters.html

così si dovrebbe implementare l'interfaccia adattabile, come già descritto. Quindi creare un AdapterFactory correttamente annotato:

@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

Sono stato in grado di verificare questo ed era proprio quello di cui avevo bisogno. Non avevo capito che i commenti sul sito Apache delineavano le annotazioni SCR necessarie per registrare il mio adattatore [https://felix.apache.org/documentation/subprojects/apache-felix-maven-scr-plugin/scr-annotations. html] Ora ho solo bisogno di capire come esprimere la proprietà di annotazione degli adattatori come una raccolta di classi supportate dall'adattatore. Grazie! – jedatu

3

nota che ho lavorato in un modo più semplice per creare adattatori Sling, annotando i metodi con una nuova annotazione @Adapter, come 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 per i dettagli, ma nota che non è ancora presente nel trunk Sling, quindi ci vorrà del tempo prima che sia rilasciato e disponibile in AEM/CQ.

+0

Questo sarebbe conveniente. Darò un'occhiata. Sembra in armonia con il lavoro che fa parte di Slice [http://www.cognifide.com/blogs/cq/make-your-cq-life-easier-with-slice/] che mira a utilizzare le annotazioni per mappare POJO proprietà a proprietà Jcr. – jedatu