6

Adobe AEM ソフトウェアは、Apache Sling Resource を取り、次のように別のクラスに適応させることができるいくつかのクラスを提供します。

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

作成および制御するクラスでこの構文を使用するには、単純にAdaptableインターフェースを実装するだけです。

ただし、リソースを新しいカスタム クラスに適応させたい場合は、AdapterFactory インターフェイスを実装して OSGI に登録する必要があるようです。

これは、アドビの Web サイトで説明されている方法です。

任意のオブジェクトをマップできるAdapterFactoryによって。オブジェクトは引き続き Adaptable インターフェースを実装し、SlingAdaptable を拡張する必要があります (これにより、adaptTo 呼び出しが中央のアダプター マネージャーに渡されます)。 これにより、 Resource などの既存のクラスの adaptTo メカニズムへのフックが可能になります

SlingScriptAdapterFactory コードについて説明しましたが、最終的にはここで点と点を結び付けていません。基本的に私はこれをしたい:

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

AdapterFactory を実装するクラスを作成し、Sling が型で見つけるだけだと期待してパッケージと共に展開するだけですか、それとも他にもあるのでしょうか?

4

2 に答える 2

5

これは少し優れたドキュメントですhttps://sling.apache.org/documentation/the-sling-engine/adapters.html

したがって、すでに説明したように、Adaptable インターフェイスを実装する必要があります。次に、適切に注釈が付けられた 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);   
    }     
}
于 2013-06-29T07:44:07.750 に答える
3

次のように、新しい @Adapter アノテーションでメソッドにアノテーションを付けることにより、Sling アダプターを作成するより簡単な方法に取り組んでいることに注意してください。

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

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

詳細については、 https://issues.apache.org/jira/browse/SLING-2938を参照してください。ただし、これはまだ Sling トランクにも含まれていないため、リリースされて AEM/CQ で利用できるようになるまでにはしばらく時間がかかることに注意してください。

于 2013-07-02T12:24:16.593 に答える