使用 Sling 介面卡 using-sling-adapters

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

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

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

使用案例 use-cases

有以下使用案例:

  • 取得實作特定的物件。

    例如,泛型的JCR型實作 Resource 介面提供對基礎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 呼叫中央介面卡管理員)。

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

  • 兩者的組合。

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

參考 reference

Sling 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 wcm

頁面 可調整為:

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

元件 可調整為:

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

範本 可調整為:

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

安全性 security

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

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

DAM dam

資產 可調整為:

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

標記 tagging

標籤 可調整為:

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

其他 other

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

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