使用 Sling 适配器 using-sling-adapters
Sling 选件 适配器模式 方便地转换实现 适应性 界面。 此界面提供一个通用 adaptTo() 将对象转换为作为参数传递的类类型的方法。
例如,要将资源对象转换为相应的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失败将导致内容为空,则可能可以接受。
缓存 caching
为了提高性能,实施可以免费缓存从 obj.adaptTo()
呼叫。 如果 obj
相同,则返回的对象相同。
此缓存针对所有 AdapterFactory
基于案例。
但是,没有一般规则 — 对象可以是新实例或现有实例。 这意味着您不能依赖任一行为。 因此,它很重要,特别是内部 AdapterFactory
,则对象在此方案中可重复使用。
工作原理 how-it-works
有多种方法 Adaptable.adaptTo()
可以实施:
-
对象本身;实现方法本身,并映射到特定对象。
-
按
AdapterFactory
,可映射任意对象。对象仍必须实现
Adaptable
界面和必须SlingAdaptable
(通过adaptTo
调用中央适配器管理器)。这允许将挂接到
adaptTo
现有类的机制,例如Resource
. -
两者兼有。
对于第一种情况,javaoc可以说明 adaptTo-targets
是可能的。 但是,对于特定子类(如基于JCR的资源),通常不可能执行此操作。 在后一种情况下,实施 AdapterFactory
通常是包的私有类的一部分,因此不会在客户端API中公开,也不会在javaoc中列出。 理论上,可以访问所有 AdapterFactory
实施 OSGi 服务运行时并查看其“适配器”(源和目标)配置,但不要将它们相互映射。 最后,这取决于必须记录的内部逻辑。 因此,该参考。
引用 reference
Sling sling
资源 调整为:
ResourceResolver 调整为:
尚无目标,但实施了“适应性”,可在自定义AdapterFactory中用作源。
WCM wcm
页面 调整为:
组件 调整为:
模板 调整为:
安全性 security
DAM dam
资产 调整为:
标记 tagging
标记 调整为:
其他 other
此外,Sling / JCR / OCM还提供 [AdapterFactory](https://sling.apache.org/site/adapters.html#Adapters-AdapterFactory)
(对象内容映射)对象。