使用 Sling 介面卡

上次更新: 2023-11-07
  • 主題:
  • Developing
    檢視有關此主題的更多資訊
  • 建立對象:
  • Developer

Sling 提供 介面卡模式 方便翻譯實作 可調整 介面。 此介面提供了一般 adaptTo() 將物件轉譯成作為引數傳遞的類別型別的方法。

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

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

使用案例

有以下使用案例:

  • 取得實作特定的物件。

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

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

    例如,以JCR為基礎 ResourceResolver 保留對請求的 JCR Session,根據此請求工作階段工作的許多物件則需要這些資源,例如 PageManagerUserManager.

  • 服務的捷徑。

    罕見情況 — sling.getService() 也很簡單。

空值傳回值

adaptTo() 傳回null。

原因有很多,包括:

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

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

快取

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

系統會針對所有使用者執行此快取 AdapterFactory 根據個案。

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

運作方式

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

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

  • AdapterFactory,可對應任意物件。

    物件仍必須實作 Adaptable 介面且必須擴充 SlingAdaptable (會傳遞 adaptTo 呼叫中央介面卡管理員)。

    這可讓連結至 adaptTo 現有類別的機制,例如 Resource.

  • 兩者的組合。

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

參考

Sling

資源 可調整為:

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

兩次
行事曆

String[]
布林值[]
Long[]
行事曆[]
Value[]
如果這是JCR屬性型資源(且值符合),則傳回值。
LabeledResource 如果這是JCR節點型資源
Page 如果這是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

頁面 可調整為:

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

元件 可調整為:

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

範本 可調整為:

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

安全性

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

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

DAM

資產 可調整為:

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

標記

標籤 可調整為:

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

其他

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

此頁面上的