6

Adobe AEM 软件提供了几个类,它们可以采用 apache Sling Resource 并将其调整到另一个类,如下所示:

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

要将此语法与您编写和控制的类一起使用,归结为简单地实现Adaptable接口。

然而,如果你想让一个资源适应你的新自定义类,似乎你必须实现 AdapterFactory 接口并在 OSGI 中注册它。

Adobe 网站是这样描述的:

通过AdapterFactory,它可以映射任意对象。对象仍然必须实现 Adaptable 接口并且必须扩展 SlingAdaptable(将 adaptTo 调用传递给中央适配器管理器)。 这允许挂钩到现有类的 adaptTo 机制,例如 Resource

我已经浏览了 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

请注意,我一直在研究一种更简单的方法来创建 Sling 适配器,方法是使用新的 @Adapter 注释来注释方法,如

  @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 回答