繁体   English   中英

如何为Sling Resource实现自定义AdapterFactory?

[英]How to implement a custom AdapterFactory for Sling Resource?

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只是按类型找到它或者还有更多它?

这是一个更好的文档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);   
    }     
}

请注意,我一直在使用一种更简单的方法来创建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中可用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM