使用 Sling 适配器

Sling 选件 适配器模式 方便地转换实现 适应性 界面。 此界面提供一个通用 adaptTo() 将对象转换为作为参数传递的类类型的方法。

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

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

用例

有以下用例:

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

    例如,基于JCR的通用 Resource 界面提供对基础JCR的访问 Node.

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

    例如,基于JCR的 ResourceResolver 包含对请求的引用 JCR Session,而基于该请求会话工作的许多对象(如 PageManagerUserManager.

  • 服务的快捷方式。

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

Null返回值

adaptTo() 可返回null。

原因有多种,包括:

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

请务必优雅地处理空值大小写。 对于jsp渲染,如果jsp失败将导致内容为空,则可能可以接受。

缓存

为了提高性能,实施可以免费缓存从 obj.adaptTo() 呼叫。 如果 obj 相同,则返回的对象相同。

此缓存针对所有 AdapterFactory 基于案例。

但是,没有一般规则 — 对象可以是新实例或现有实例。 这意味着您不能依赖任一行为。 因此,它很重要,特别是内部 AdapterFactory,则对象在此方案中可重复使用。

工作原理

有多种方法 Adaptable.adaptTo() 可以实施:

  • 对象本身;实现方法本身,并映射到特定对象。

  • AdapterFactory,可映射任意对象。

    对象仍必须实现 Adaptable 界面和必须 SlingAdaptable (通过 adaptTo 调用中央适配器管理器)。

    这允许将挂接到 adaptTo 现有类的机制,例如 Resource.

  • 两者兼有。

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

引用

Sling

资源 调整为:

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

双精度
日历

String[]
Boolean[]
Long[]
日历[]
Value[]
如果这是基于JCR属性的资源(值适合),则返回值。
LakedResource 如果这是基于JCR节点的资源。
页面 如果这是基于JCR的资源,并且该节点是 cq:Page (或 cq:PseudoPage)。
组件 如果这是 cq:Component 节点资源。
Design 如果这是设计节点(cq:Page)。
模板 如果这是 cq:Template 节点资源。
Blueprint 如果这是 cq:Template 节点资源。
资产 如果这是dam:Asset节点资源。
演绎版 如果这是dam:Asset演绎版(nt:file位于dam:Assert的演绎版文件夹下)
Tag 如果这是 cq:Tag 节点资源。
UserManager 基于JCR会话(如果这是基于JCR的资源,且用户有权访问UserManager)。
可授权 “可授权”是“用户”和“组”的常用基本界面。
用户 用户是可进行身份验证和模拟的特殊可授权。
SimpleSearch 在资源下方搜索(或使用setSearchIn())(如果这是基于JCR的资源)。
WorkflowStatus 给定页面/工作流有效负载节点的工作流状态。
复制状态 给定资源或其jcr:content子节点的复制状态(首先选中)。
连接器资源 如果某些类型是基于JCR节点的资源,则返回该类型的适配连接器资源。
配置 如果这是 cq:ContentSyncConfig 节点资源。
ConfigEntry 如果低于 cq:ContentSyncConfig 节点资源。

ResourceResolver 调整为:

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

SlingHttpServletRequest 调整为:

尚无目标,但实施了“适应性”,可在自定义AdapterFactory中用作源。

SlingHttpServletResponse 调整为:

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

WCM

页面 调整为:

Resource
页面的资源。
LakedResource 标记的资源(==此)。
节点 页面的节点。
... 页面资源可以调整的所有内容。

组件 调整为:

资源 组件的资源。
LakedResource 标记的资源(==此)。
节点 组件的节点。
组件资源可以适应的所有内容。

模板 调整为:

Resource
模板的资源。
LakedResource 标记的资源(==此)。
节点 此模板的节点。
... 模板资源可以适应的所有内容。

安全性

可授权, 用户 适应:

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

DAM

资产 调整为:

资源 资产的资源。
节点 资产的节点。
资产资源可以调整的所有内容。

标记

标记 调整为:

资源 标记的资源。
节点 标记的节点。
标记资源可以调整的所有内容。

其他

此外,Sling / JCR / OCM还提供 AdapterFactory (对象内容映射)对象。

在此页面上