使用 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)

在此页面上