使用 Sling 适配器 using-sling-adapters

Sling提供适配器模式,以便方便地翻译实现Adaptable接口的对象。 此接口提供了一个通用adaptTo()方法,它将对象转换为作为参数传递的类类型。

例如,要将Resource对象转换为对应的Node对象,您只需执行以下操作:

Node node = resource.adaptTo(Node.class);

用例 use-cases

有以下用例:

  • 获取特定于实施的对象。

    例如,通用Resource接口的基于JCR的实现提供了对基础JCR Node的访问。

  • 快捷方式创建需要传递内部上下文对象的对象。

    例如,基于JCR的ResourceResolver保留对请求的JCR Session的引用,而基于该请求会话工作的许多对象(如PageManagerUserManager)需要该引用。

  • 服务的快捷方式。

    极少数情况 — 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调用传递到中央适配器管理器)。

    此方法允许挂接到现有类(如Resource)的adaptTo机制。

  • 两者的组合。

对于第一种情况,Java™文档可以说明哪些adaptTo-targets是可能的。 但是,对于特定的子类(如基于JCR的资源),此语句通常是不可能的。 在后一种情况下,AdapterFactory的实现通常是捆绑包的私有类的一部分,因此未在客户端API中公开,也未在Java™文档中列出。 从理论上讲,可以从OSGi服务运行时访问所有AdapterFactory实现并查看其“可适应的”(源和目标)配置,但不能将它们相互映射。 最后,它取决于内部逻辑,必须记录该逻辑。 因此,此参考内容。

引用 reference

Sling sling

资源 已适应:

节点
如果是基于JCR节点的资源或JCR属性,则引用节点
属性
如果它是基于JCR属性的资源
项目
如果它是基于JCR的资源(节点或属性)
地图
如果是基于JCR节点的资源(或其他支持值的资源映射),则返回属性的映射
值映射
如果是基于JCR节点的资源(或其他支持值的资源映射),则返回便于使用的属性映射。 也可以使用
ResourceUtil.getValueMap(Resource)实现(更简单地)(处理null大小写等)
InheritanceValueMap
ValueMap的扩展,允许在查找属性时考虑资源的层次结构
ModifiableValueMap
ValueMap的扩展,允许您修改该节点上的属性
输入流
返回文件资源的二进制内容(如果它是基于JCR节点的资源并且节点类型为nt:filent:resource;如果它是捆绑资源;如果它是文件系统资源,则返回文件内容)。 或者,返回二进制JCR属性资源的数据。
URL
返回资源的URL(如果此节点是基于JCR节点的资源,则返回其存储库URL;如果它是捆绑资源,则返回jar捆绑资源URL;如果它是文件系统资源,则返回文件URL)
文件
如果它是文件系统资源
SlingScript
如果资源是为其使用sling注册脚本引擎的脚本(例如jsp文件)
Servlet
如果资源是使用sling注册脚本引擎的脚本(例如jsp文件),或者如果它是servlet资源
String
Boolean
Long
Double
日历

String[]
Boolean[]
Long[]
Calendar[]
值[]
如果是基于JCR属性的资源,则返回值(该值适合)
LabeledResource
如果它是基于JCR节点的资源
页面
如果它是基于JCR节点的资源,并且该节点是cq:Page(或cq:PseudoPage
组件
如果它是cq:Component节点资源
设计
如果它是设计节点(cq:Page)
模板
如果它是cq:Template节点资源
Blueprint
如果它是cq:Template节点资源
资源
如果它是dam:Asset节点资源
演绎版
如果它是dam:Asset演绎版(nt:file,在dam:Assert的演绎版文件夹下)
标记
如果它是cq:Tag节点资源
用户管理器
基于JCR会话(如果是基于JCR的资源),并且用户有权访问UserManager
可授权
“可授权”是“用户”和“组”的公共基本界面
用户
用户是一种特殊的可授权对象,可以进行身份验证和模拟
简单搜索
在资源下搜索(如果它是基于JCR的资源,则使用setSearchIn())
工作流状态
给定页面/工作流有效负荷节点的工作流状态
复制状态
给定资源或其jcr:content子节点的复制状态(首先选中)
连接器资源
如果特定类型是基于JCR节点的资源,则返回已修改的连接器资源
配置
如果它是cq:ContentSyncConfig节点资源
ConfigEntry
如果它在cq:ContentSyncConfig节点资源下

ResourceResolver 适应:

会话
请求的JCR会话(如果是基于JCR的资源解析程序,则为默认)
PageManager
组件管理器
Designer
AssetManager
基于JCR会话(如果是基于JCR的资源解析程序)
标记管理器
基于JCR会话(如果是基于JCR的资源解析程序)
用户管理器
UserManager提供对可授权对象(即用户和组)的访问权限以及维护可授权对象的方法。 用户管理器绑定到特定会话
可授权
当前用户
用户
当前用户
Querybuilder
外部化器
用于外部化绝对URL,即使没有请求对象

SlingHttpServletRequest 适应:

还没有目标,但实施了Adaptable,并且可以在自定义AdapterFactory中用作源。

SlingHttpServletResponse 适应:

ContentHandler
(XML)
如果是Sling重写器响应

WCM wcm

页面 ​适应:

Resource
页面的资源。
LabeledResource
已标记的资源(==此)。
节点
页面的节点。
...
页面资源可适应的一切。

组件 ​适应:

Resource
组件的资源。
标记资源
已标记的资源(==此)。
节点
组件的节点。
组件资源可以适应的一切。

模板 ​适应:

资源
模板的资源。
LabeledResource
已标记的资源(==此)。
节点
此模板的节点。
...
模板资源可以适应的一切。

安全性 security

可授权用户 ​和​ ​适应:

节点
返回用户/组主节点。
ReplicationStatus
返回用户/组主节点的复制状态。

DAM dam

资源 ​已适应:

Resource
资源的资源。
节点
资源的节点。
资产资源可以适应的一切。

标记 tagging

标记 ​适应:

Resource
标记的资源。
节点
标记的节点。
标记资源可以适应的一切。

其他 other

此外,Sling / JCR / OCM还为自定义OCM (对象内容映射)对象提供了AdapterFactory

recommendation-more-help
fbcff2a9-b6fe-4574-b04a-21e75df764ab