使用 Sling 适配器 using-sling-adapters

CAUTION
AEM 6.4已结束扩展支持,本文档将不再更新。 有关更多详细信息,请参阅 技术支助期. 查找支持的版本 此处.

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

例如,要将资源对象转换为相应的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() 可返回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

资源 调整为:

节点
如果这是基于JCR的资源或引用节点的JCR属性。
属性
如果这是基于JCR属性的资源。
项目
如果这是基于JCR的资源(节点或属性)。
地图
返回属性的映射(如果这是基于JCR节点的资源(或其他支持值的资源映射)。
ValueMap
如果这是基于JCR节点的资源(或其他资源支持值映射),则返回属性的方便使用映射。 也可以(更简单)使用
ResourceUtil.getValueMap(Resource) (处理空大小写等)
继承值映射
扩展 ValueMap 这允许在查找属性时考虑资源的层次结构。
PersistableValueMap
如果这是基于JCR节点的资源,并且用户有权修改该节点上的属性。
注意:多个可持续映射不共享其值。
InputStream
返回“文件”的二进制内容nt:resource
AuthorizableResourceProvider``org.apache.sling.jackrabbit.usermanager``/system/userManager
cq:Page``cq:PseudoPage
cq:Component
cq:Page
cq:Template
cq:Page
cq:Tag
cq:Preferences
cq:ContentSyncConfig
cq:ContentSyncConfig

ResourceResolver 调整为:

会话
请求的JCR会话(如果这是基于JCR的资源解析程序(默认))。
PageManager
组件管理器
Designer
AssetManager
基于JCR会话,如果这是基于JCR的资源解析程序。
TagManager
基于JCR会话,如果这是基于JCR的资源解析程序。
UserManager
基于JCR会话,如果这是基于JCR的资源解析程序,并且用户有权访问UserManager。
可授权
当前用户。
用户
当前用户。
权限管理器
首选项
当前用户的首选项(如果这是基于JCR的资源解析程序,则基于JCR会话)。
首选项服务
PinManager
QueryBuilder
外部器
用于外部化绝对URL,即使使用外部请求对象也是如此。

SlingHttpServletRequest 调整为:

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

SlingHttpServletResponse 调整为:

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

WCM wcm

页面 调整为:

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

组件 调整为:

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

模板 调整为:

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

安全性 security

可授权, 用户 适应:

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

DAM dam

资产 调整为:

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

标记 tagging

标记 调整为:

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

其他 other

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

recommendation-more-help
2315f3f5-cb4a-4530-9999-30c8319c520e