使用 Sling 介面卡 using-sling-adapters

Sling提供介面卡模式,以方便翻譯實作介面介面的物件。 此介面提供泛型adaptTo()方法,將物件轉譯成作為引數傳遞的類別型別。

例如,若要將Resource物件轉譯為對應的Node物件,您只需執行下列動作即可:

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

使用案例 use-cases

有以下使用案例:

  • 取得實作特定的物件。

    例如,泛型Resource介面的JCR型實作提供對基礎JCR Node的存取權。

  • 需要傳遞內部前後關聯物件的物件的快速鍵建立。

    例如,以JCR為基礎的ResourceResolver保留對請求的JCR Session的參考,而許多將根據該請求工作階段運作的物件需要該參考,例如PageManagerUserManager

  • 服務的捷徑。

    罕見的情況 — sling.getService()也相當簡單。

空值傳回值 null-return-value

adaptTo()傳回null。

原因有很多,包括:

  • 實作不支援目標型別
  • 處理此情況的介面卡工廠未啟用(例如,因為遺失服務參考)
  • 內部條件失敗
  • 服務無法使用

請務必謹慎處理Null案例。 對於jsp轉譯,如果會導致jsp失敗,那是可以接受的。

快取 caching

若要改善效能,實作可自由快取obj.adaptTo()呼叫傳回的物件。 如果obj相同,則傳回的物件也相同。

已針對所有AdapterFactory個案例執行此快取。

但是,沒有一般規則 — 物件可能是新例項或現有例項。 這表示您無法依賴任一行為。 因此,物件在此情境中可重複使用很重要,尤其是在AdapterFactory內。

運作方式 how-it-works

有多種方式可以實作Adaptable.adaptTo()

  • 物件本身;實作方法本身並對應至特定物件。

  • AdapterFactory可以對應任意物件。

    物件仍必須實作Adaptable介面且必須延伸SlingAdaptable (這會將adaptTo呼叫傳遞給中央介面卡管理員)。

    這允許連結到現有類別(例如Resource)的adaptTo機制。

  • 兩者的組合。

對於第一種情況,Java™檔案可以說明哪些adaptTo-targets是可能的。 然而,對於特定子類別(例如JCR型資源),通常無法執行此操作。 在後一種情況下,AdapterFactory的實施通常是套件組合私用類別的一部分,因此不會在使用者端API中公開,也不會列在Java™檔案中。 理論上來說,可以從OSGi服務執行階段存取所有AdapterFactory實作,並檢視其「可適配」(來源和目標)組態,但無法相互對應。 最後,這取決於內部邏輯,這必須記錄在案。 因此,請參閱此參考檔案。

參考 reference

Sling sling

資源 已調整為:

節點
如果這是以JCR節點為基礎的資源,或參照節點的JCR屬性。
屬性
如果這是JCR屬性型資源
項目
如果這是JCR型資源(節點或屬性)
地圖
如果這是JCR節點型資源(或其他支援值的資源對應),則傳回屬性的對應
值圖
如果這是JCR節點型資源(或其他支援值的資源對應),則傳回方便使用的屬性對應。 也可以使用
ResourceUtil.getValueMap(Resource) (處理null大小寫等)來達成(更簡單)
InheritanceValueMap
ValueMap的延伸模組,可在尋找屬性時考慮資源的階層
ModifiableValueMap
ValueMap的延伸模組,可讓您修改該節點上的屬性
輸入資料流
傳回檔案資源的二進位內容(如果這是JCR節點型資源,且節點型別是nt:filent:resource;如果這是組合資源;如果這是檔案系統資源,則傳回檔案內容)或二進位JCR屬性資源的資料
URL
傳回資源的URL (如果這是JCR節點型資源,則傳回此節點的存放庫URL;如果這是套件資源,則傳回jar套件URL;如果這是檔案系統資源,則傳回檔案URL)
檔案
如果這是檔案系統資源
SlingScript
如果此資源是指令碼(例如jsp檔案),其指令碼引擎已向sling註冊
Servlet
如果此資源是向sling註冊指令碼引擎的指令碼(例如jsp檔案),或如果這是servlet資源。
String
Boolean
Long
Double
行事曆

String[]
Boolean[]
Long[]
行事曆[]
值[]
如果這是JCR屬性型資源(且值符合),則傳回值。
LabeledResource
如果這是JCR節點型資源
頁面
如果這是JCR節點型資源,而且節點是cq:Page (或cq:PseudoPage
元件
如果這是cq:Component節點資源
設計
如果這是設計節點(cq:Page)
範本
如果這是cq:Template節點資源
藍圖
如果這是cq:Template節點資源
資產
如果這是dam:Asset節點資源
轉譯
如果這是dam:Asset轉譯(nt:file,在dam:Assert的轉譯資料夾下)
標記
如果這是cq:Tag節點資源
使用者管理員
根據JCR工作階段,如果這是JCR型資源,而且使用者有權存取UserManager
可授權項目
「可授權專案」是「使用者」和「群組」的共同基礎介面
使用者
使用者是可驗證及模擬的特殊可授權專案
Simplesearch
在資源底下搜尋(如果這是JCR型資源,則使用setSearchIn())
工作流程狀態
特定頁面/工作流程裝載節點的工作流程狀態
復寫狀態
指定資源或其jcr:content子節點的復寫狀態(請先核取)
聯結器資源
如果這是JCR節點型資源,則傳回適合特定型別的聯結器資源
設定
如果這是cq:ContentSyncConfig節點資源
ConfigEntry
如果這在cq:ContentSyncConfig節點資源之下

ResourceResolver 適配:

工作階段
請求的JCR工作階段(如果這是JCR型資源解析器) (預設)
PageManager
元件管理員
Designer
Assetmanager
根據JCR工作階段,如果這是JCR型資源解析程式
標籤管理員
根據JCR工作階段,如果這是JCR型資源解析程式
使用者管理員
UserManager提供可授權物件(即使用者和群組)的存取權及維護方法。 UserManager繫結至特定工作階段
可授權
目前使用者
使用者
目前使用者
Querybuilder
Externalizer
用於將絕對URL外部化,即使沒有要求物件

SlingHttpServletRequest 已調整為:

尚未有目標,但實作可調整的,而且可以在自訂AdapterFactory中作為來源使用。

SlingHttpServletResponse 已調整為:

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

WCM wcm

頁面 ​已調整為:

Resource
頁面資源
LabeledResource
已標示的資源(==此)
節點
頁面節點
...
頁面資源可適應的所有內容

元件 ​已調整:

Resource
元件的資源。
LabeledResource
已標示的資源(==此)。
節點
元件的節點。
元件資源可適應的所有專案。

範本 ​適配:

資源
範本的資源
LabeledResource
已標示的資源(==此)
節點
此範本的節點
...
可調整範本資源的所有內容。

安全性 security

可授權、{User​ 和​ ​群組**​適配:

節點
傳回使用者/群組主節點。
ReplicationStatus
傳回使用者/群組主節點的復寫狀態。

DAM dam

資產 ​已調整為:

Resource
資產的資源。
節點
資產的節點。
資產資源可適應的所有內容。

標記 tagging

標籤 ​已調整為:

Resource
標籤的資源。
節點
標籤的節點。
標籤的資源可適應的所有內容。

其他 other

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

recommendation-more-help
19ffd973-7af2-44d0-84b5-d547b0dffee2