2013-06-28 21 views
5

Adobe AEM yazılım bir apache Sling Kaynak alıp şöyle bir başka sınıfa adapte çeşitli sınıfları sağlar Adaptable arabirimi. Yeni özel sınıf olduğunu adaptTo için Kaynak etkinleştirmek istiyorsanızSling Resource için özel bir AdapterFactory nasıl uygulanır?</p> <pre><code>Page page = resource.adaptTo(Page.class); </code></pre> <p>Eğer yazar ve bu basitçe uygulanması için aşağı kaynar kontrol sınıfları ile bu sözdizimini kullanmak için:

Ancak, AdapterFactory arabirimini uygulayan ve OSGi içinde kaydettikten var gibi görünüyor.

Bu Adobe website bunu şöyle tarif etmektedir: keyfi nesneler haritalayabilirsiniz bir AdapterFactory, By

. Nesneler hala Adaptable arayüzünü uygulamak zorundadır ve SlingAdaptable'ı genişletmelidir (adaptasyon çağrısını merkezi bir adaptör yöneticisine iletir). Bu, kaynak gibi mevcut sınıfları için adaptTo mekanizması içine kanca sağlar.

SlingScriptAdapterFactory kodunu geçtim, ancak sonuçta burada noktaları birleştirmiyorum. Temelde ben bunu yapmak istiyorum:

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

Ben AdapterFactory uygulayan bir sınıf oluşturmak ve basit bir şekilde daha var Sling sadece tipine göre bulabilirsiniz ya edeceğini bekliyor paketi ile dağıtmak mı?

cevap

4

Burada zaten açıklandığı gibi https://sling.apache.org/documentation/the-sling-engine/adapters.html

Yani, Uyarlanabilir arabirimini uygulamalıdır biraz daha iyi dokümantasyon olduğunu. Yeni bir @Adapter ek açıklamasıyla yöntemlerini açıklayarak, Sling adaptörleri oluşturmak için daha basit bir şekilde çalışıyoruz

@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

Bunu doğrulayabildim ve ihtiyacım olan şey buydu. Apache sitesindeki yorumların adaptörümü kaydettirmek için gerekli SCR ek açıklamalarını belirttiğini anlamamıştım [https://felix.apache.org/documentation/subprojects/apache-felix-maven-scr-plugin/scr-annotations. html] Şimdi sadece adaptör açıklama özelliğini, adaptörün desteklediği sınıfların bir koleksiyonu olarak nasıl ifade edeceğimi anlamaya ihtiyacım var. Teşekkürler! – jedatu

3

Not,

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

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

See olduğu gibi: Sonra düzgün açıklamalı AdapterFactory oluşturmak Ayrıntılar için https://issues.apache.org/jira/browse/SLING-2938, ancak bunun Sling bagajında ​​bile olmadığına dikkat edin, bu yüzden AEM/CQ'da piyasaya sürülmeden ve piyasaya sürülmeden önce biraz zaman alacaktır.

+0

Bu uygun olurdu. Bir bakacağım. POJO'yu haritalamak için ek açıklamaları kullanmayı amaçlayan Slice [http://www.cognifide.com/blogs/cq/make-your-cq-life-easier-with-slice/] 'nin parçası olan çalışma ile uyumlu görünüyor. Jcr özelliklerine özellikler. – jedatu