使用 Sling 适配器 using-sling-adapters

Sling 选件和 适配器模式 方便地翻译实现 可适应 界面。 此界面提供了一般 adaptTo() 将对象转换为作为参数传递的类类型的方法。

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

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

用例 use-cases

有以下用例:

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

    例如,基于JCR的泛型实现 Resource 接口提供对基础JCR的访问 Node.

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

    例如,基于JCR ResourceResolver 包含对请求的 JCR Session,而基于请求会话工作的许多对象又需要这些会话,例如 PageManagerUserManager.

  • 服务的快捷方式。

    一个罕见的案例。 sling.getService() 也很简单。

Null返回值 null-return-value

adaptTo() 返回空值。

原因有多种,包括:

  • 实施不支持目标类型
  • 处理此情况的适配器工厂未处于活动状态(例如,由于缺少服务引用)
  • 内部条件失败
  • 服务不可用

正确处理空值情况很重要。 对于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™文档中列出。 从理论上讲,访问所有 AdapterFactory 实施来自 osgi 服务运行时并查看其“可适应的”(源和目标)配置,但不会将它们相互映射。 最终,这取决于内部逻辑,必须记录在案。 因此,此参考内容。

引用 reference

Sling sling

资源 可适应:

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

多次
日历

String[]
Boolean[]
Long[]
日历[]
值[]
如果这是基于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
组件管理器
设计器
AssetManager
基于JCR会话,如果这是基于JCR的资源解析程序
标记管理器
基于JCR会话,如果这是基于JCR的资源解析程序
用户管理器
UserManager提供对可授权对象(即用户和组)的访问权限以及维护该对象的方法。 用户管理器绑定到特定会话
可授权
当前用户
用户
当前用户
Querybuilder
外部化器
用于外部化绝对URL,即使没有请求对象也是如此

SlingHttpServletRequest 可适应:

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

SlingHttpServletResponse 可适应:

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

WCM wcm

页面 可适应:

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

组件 可适应:

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

模板 可适应:

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

安全性 security

可授权User和 ​ 组** 适应:

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

DAM dam

资产 可适应:

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

标记 tagging

标记 可适应:

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

其他 other

此外,Sling/JCR/OCM还提供 [AdapterFactory](https://sling.apache.org/site/adapters.html#Adapters-AdapterFactory) 用于自定义OCM (对象内容映射)对象。

recommendation-more-help
19ffd973-7af2-44d0-84b5-d547b0dffee2