使用 Sling 介面卡

🔗 Slingoffers an Adapter patterforts 可方便地轉換實現Adaptable介面的 對象。此介面提供通用adapTo()方法,該方法將對象轉換為作為參數傳遞的類類型。

例如,要將資源對象轉換為相應的Node對象,您只需執行以下操作:

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

使用案例

有下列使用案例:

  • 取得實作專屬物件。

    例如,通用Resource介面的基於JCR的實現提供對基礎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

  • 兩者結合。

對於第一種情況,Javadoc可以說明adaptTo-targets的可能性。 但是,對於特定子類(例如基於JCR的資源),這通常是不可能的。 在後一種情況下,AdapterFactory的實施通常是套件組合的專用類的一部分,因此不會在客戶端API中公開,也不會列在javadoc中。 理論上,從OSGi服務運行時訪問所有AdapterFactory實施並查看其「adaptables」(源和目標)配置,但不能將它們相互映射。 最後,這取決於內部邏輯,必須加以記錄。 因此,這個參考。

引用

Sling

資源適應於:

節點 如果這是基於JCR的資源或引用節點的JCR屬性。
屬性 如果這是JCR型屬性型資源。
項目 如果這是以JCR為基礎的資源(節點或屬性)。
地圖 如果這是基於JCR節點的資源(或其他資源支援值映射),則返回屬性的映射。
ValueMap 如果屬性是基於JCR節點的資源(或其他資源支援值映射),則返回屬性的方便使用映射。 也可以使用
ResourceUtil.getValueMap(Resource)(處理空大小寫等)來達到(更簡單)。
InheritanceValueMap 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

ResourceResolver適應於:

工作階段 如果這是以JCR為基礎的資源解析器(預設),則要求的JCR工作階段。
PageManager
元件管理器
設計工具
AssetManager 根據JCR工作階段,如果這是以JCR為基礎的資源解析器。
TagManager 根據JCR工作階段,如果這是以JCR為基礎的資源解析器。
UserManager 根據JCR工作階段,如果這是以JCR為基礎的資源解析器,以及使用者是否具有存取UserManager的權限。
可授權項目 目前的使用者。
使用者
目前的使用者。
PrivilegeManager
偏好設定 目前使用者的偏好設定(如果這是以JCR為基礎的資源解析器,則以JCR工作階段為基礎)。
首選項服務
PinManager
QueryBuilder
外置器 用於外部化絕對URL,即使沒有要求物件。

SlingHttpServletRequest適應於:

尚無目標,但實施了可適應性,可作為自定義AdapterFactory中的源。

SlingHttpServletResponse適應於:

ContentHandler
(XML)
如果這是Sling重寫程式回應。

WCM

頁面適應:

資源
頁面的資源。
LakedResource 標示為資源(==此)。
節點 頁面的節點。
... 頁面資源可調整的所有項目。

元件適應於:

資源 元件的資源。
LakedResource 標示為資源(==此)。
節點 元件的節點。
元件資源可適用於的所有項目。

範本適應於:

資源
範本的資源。
LakedResource 標示為資源(==此)。
節點 此模板的節點。
... 範本資源可調整的所有項目。

安全性

可授權、使 用者 和群組適應:

節點 返回用戶/組首節點。
複製狀態 返回用戶/組主節點的複製狀態。

DAM

資產適應於:

資源 資產的資源。
節點 資產的節點。
資產資源可適應的所有項目。

標記

標籤適應:

資源 標籤的資源。
節點 標籤的節點。
標籤資源可調整的所有項目。

其他

此外,Sling / JCR / OCM也為自訂OCM(物件內容對應)物件提供 [AdapterFactory](https://sling.apache.org/site/adapters.html#Adapters-AdapterFactory)

本頁內容