使用 Sling 适配器 using-sling-adapters
Sling提供适配器模式,以便方便地翻译实现Adaptable接口的对象。 此接口提供了一个通用adaptTo()方法,它将对象转换为作为参数传递的类类型。
例如,要将Resource对象转换为对应的Node对象,您只需执行以下操作:
Node node = resource.adaptTo(Node.class);
用例 use-cases
有以下用例:
-
获取特定于实施的对象。
-
快捷方式创建需要传递内部上下文对象的对象。
例如,基于JCR的
ResourceResolver保留对请求的JCR Session的引用,而基于该请求会话工作的许多对象(如PageManager或UserManager)需要该引用。 -
服务的快捷方式。
极少数情况 —
sling.getService()也非常简单。
Null返回值 null-return-value
adaptTo()可以返回null。
返回空值有各种原因,包括:
- 实施不支持目标类型
- 处理此情况的适配器工厂未处于活动状态(例如,由于缺少服务引用)
- 内部条件失败
- 服务不可用
正确处理空值情况很重要。 对于jsp渲染,如果导致jsp失败导致内容为空,则最好是让jsp失败。
缓存 caching
为了提高性能,实施可以缓存从obj.adaptTo()调用返回的对象。 如果obj是相同的,则返回的对象是相同的。
对所有基于AdapterFactory的案例执行此缓存。
但是,没有一般规则 — 对象可以是新实例或现有实例。 因此,这意味着您无法依赖任何一种行为。 因此,对象可在此方案中重用,这一点很重要,尤其是在AdapterFactory内。
工作原理 how-it-works
有多种方法可以实现Adaptable.adaptTo():
-
对象本身;实现方法本身并映射到某些对象。
-
通过
AdapterFactory,可以映射任意对象。对象仍必须实现
Adaptable接口,并且必须扩展SlingAdaptable(它将adaptTo调用传递到中央适配器管理器)。此方法允许挂接到现有类(如
adaptTo)的Resource机制。 -
两者的组合。
对于第一种情况,Java™文档可以说明哪些adaptTo-targets是可能的。 但是,对于特定的子类(如基于JCR的资源),此语句通常是不可能的。 在后一种情况下,AdapterFactory的实现通常是捆绑包的私有类的一部分,因此未在客户端API中公开,也未在Java™文档中列出。 从理论上讲,可以从AdapterFactoryOSGi服务运行时访问所有实现并查看其“可适应的”(源和目标)配置,但不能将它们相互映射。 最后,它取决于内部逻辑,必须记录该逻辑。 因此,此参考内容。
WCM wcm
页面适应:
组件适应:
模板适应:
安全性 security
可授权、用户和 组 适应:
DAM dam
资源已适应:
标记 tagging
标记适应:
其他 other
此外,Sling / JCR / OCM还为自定义OCM (AdapterFactory对象内容映射)对象提供了🔗。