使用 Sling 适配器

Slingoffers an Adapter 模式,以便于转换实现Adaptable接口的 对象。此接口提供通用adaptTo()方法,它将对象转换为作为参数传递的类类型。

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

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

用例

有以下用例:

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

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

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

    例如,基于JCR的ResourceResolver包含对请求的JCR Session的引用,而对于许多将基于该请求会话工作的对象,如PageManagerUserManager,则需要该引用。

  • 服务的快捷方式。

    极少的情况- sling.getService()也很简单。

空返回值

adaptTo() 可以返回null。

原因有多种,包括:

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

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

缓存

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

此缓存针对所有基于AdapterFactory的情况执行。

但是,没有一般规则——对象可以是新实例或现有实例。 这意味着您不能依赖任何一种行为。 因此,在AdapterFactory中,对象在此场景中是可重用的,这一点很重要。

工作原理

Adaptable.adaptTo()有多种实现方式:

  • 物体本身;实现方法本身并映射到某些对象。

  • AdapterFactory`,可映射任意对象。

    这些对象仍必须实现Adaptable接口,并且必须扩展SlingAdaptable(它将adaptTo调用传递给中央适配器管理器)。

    这允许将现有类(如Resource)的adaptTo机制挂接到其中。

  • 两者兼有。

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

针对开发人员的 Adobe AIR API 参考

Sling

源调整为:

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

资源 解析适应于:

会话 请求的JCR会话(如果这是基于JCR的资源解析程序(默认))。
PageManager
ComponentManager
设计人员
AssetManager 基于JCR会话,如果这是基于JCR的资源解析程序。
TagManager 基于JCR会话,如果这是基于JCR的资源解析程序。
UserManager 基于JCR会话,如果这是基于JCR的资源解析程序,并且用户具有访问UserManager的权限。
可授权 当前用户。
用户
当前用户。
PrivilegeManager
首选项 当前用户的首选项(如果这是基于JCR的资源解析程序,则基于JCR会话)。
首选项服务
PinManager
QueryBuilder
外置器 用于外部化绝对URL,即使没有请求对象。

SlingHttpServletRequest 调整为:

尚未目标,但实现了Adaptible(适应性),可用作自定义AdapterFactory中的源。

SlingHttpServletResponse 适应于:

ContentHandler
(XML)
如果这是一个吊带重写者的回应。

WCM

面调整为:

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

组件 适应于:

资源 组件的资源。
LabeledResource 标记的资源(==此)。
节点 组件的节点。
组件的资源可以调整的所有内容。

模板 适应于:

资源
模板的资源。
LabeledResource 标记的资源(==此)。
节点 此模板的节点。
... 模板资源可以调整的所有内容。

安全

可授权 用户 和组适应:

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

DAM

产适应:

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

标记

语适应:

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

其他

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

在此页面上

Adobe Summit Banner

A virtual event April 27-28.

Expand your skills and get inspired.

Register for free
Adobe Summit Banner

A virtual event April 27-28.

Expand your skills and get inspired.

Register for free
Adobe Maker Awards Banner

Time to shine!

Apply now for the 2021 Adobe Experience Maker Awards.

Apply now
Adobe Maker Awards Banner

Time to shine!

Apply now for the 2021 Adobe Experience Maker Awards.

Apply now