Slingoffers an Adapter patterno to fully translate objects that implement the Adaptableinterface.此介面提供通用adaptTo()方法,將對象轉換為作為參數傳遞的類類型。
例如,要將資源對象轉換為相應的節點對象,您只需執行以下操作:
Node node = resource.adaptTo(Node.class);
以下是使用案例:
取得實作專屬物件。
建立需要傳遞內部上下文對象的對象的快捷方式。
例如,以JCR為基礎的ResourceResolver
包含請求的JCR Session
參考,而許多將根據該請求作業運作的物件則需要該參考,例如PageManager
或UserManager
。
服務的捷徑。
罕見的案例- 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
實現並查看其「適配器」(源和目標)配置,但不能將它們相互映射。 最後,這取決於內部邏輯,而內部邏輯必須加以記錄。 因此,這一參考。
資 源適應:
節點 | 如果這是基於JCR節點的資源或引用節點的JCR屬性。 |
屬性 | 如果這是基於JCR屬性的資源。 |
項目 | 如果這是基於JCR的資源(節點或屬性)。 |
地圖 | 如果這是基於JCR節點的資源(或其他資源支援值映射),則返回屬性的映射。 |
ValueMap | 如果屬性是基於JCR節點的資源(或其他資源支援值映射),則返回該屬性的方便使用映射。 也可以使用ResourceUtil.getValueMap(Resource) (處理空大小寫等)來實現(更簡單)。 |
InheritanceValueMap | ValueMap的擴展,允許在查找屬性時考慮資源的層次。 |
ModifableValueMap | ValueMap的擴展,允許您修改該節點上的屬性。 |
InputStream | 返回檔案資源的二進位內容(如果這是基於JCR的資源,且節點類型為nt:file 或nt:resource ;如果這是包資源;檔案內容(如果這是檔案系統資源)或二進位JCR屬性資源的資料。 |
URL | 返回資源的URL(如果此節點是基於JCR節點的資源,則返回此節點的儲存庫URL;jar bundle URL(如果這是包資源);檔案URL(如果這是檔案系統資源)。 |
檔案 | 如果這是檔案系統資源。 |
SlingScript | 如果此資源是指其指令碼引擎已註冊為sling的指令碼(例如jsp檔案)。 |
Servlet | 如果此資源是指已使用sling註冊指令碼引擎的指令碼(例如jsp檔案),或此為servlet資源。 |
StringBooleanLongDoubleCalendarValueString[] Boolean[] Long[] Calendar[] Value[] |
如果這是基於JCR屬性的資源(且值符合),則返回值。 |
LakedResource | 如果這是基於JCR節點的資源。 |
頁面 | 如果這是基於JCR節點的資源,而節點是cq:Page (或cq:PseudoPage )。 |
元件 | 如果這是cq:Component 節點資源。 |
設計 | 如果這是設計節點(cq:Page )。 |
範本 | 如果這是cq:Template 節點資源。 |
Blueprint | 如果這是cq:Template 節點資源。 |
資產 | 如果這是dam:資產節點資源。 |
轉譯 | 如果這是dam:Asset轉譯(nt:file,位於dam:Assert的轉譯資料夾下) |
標記 | 如果這是cq:Tag 節點資源。 |
UserManager | 根據JCR會話(如果這是基於JCR的資源,且用戶具有訪問UserManager的權限)。 |
可授權項目 | 「可授權」是「使用者」和「群組」的常見基本介面。 |
使用者 | 使用者是可驗證和模擬的特殊可授權使用者。 |
SimpleSearch | 在資源下進行搜索(如果這是基於JCR的資源,則使用setSearchIn())。 |
WorkflowStatus | 指定頁面/工作流裝載節點的工作流狀態。 |
ReplicationStatus | 給定資源或其jcr:content子節點的複製狀態(首先選中)。 |
ConnectorResource | 如果這是基於JCR節點的資源,則返回某些類型的適配連接器資源。 |
設定 | 如果這是cq:ContentSyncConfig 節點資源。 |
ConfigEntry | 如果此值位於cq:ContentSyncConfig 節點資源下方。 |
資源 解析器適用於:
會話 | 請求的JCR會話(如果這是基於JCR的資源解析器(預設))。 |
PageManager | |
ComponentManager | |
設計人員 | |
AssetManager | 根據JCR會話,如果這是基於JCR的資源解析器。 |
TagManager | 根據JCR會話,如果這是基於JCR的資源解析器。 |
UserManager | UserManager提供對可授權對象(即用戶和組)的訪問和維護方法。 UserManager綁定到特定會話。 |
可授權項目 | 目前的使用者。 |
使用者 |
目前的使用者。 |
QueryBuilder | |
外置式 | 用於外部化絕對URL,即使沒有請求物件。 |
SlingHttpServletRequestateed適用於:
目標尚未定位,但實施了可適應性,可作為自定義AdapterFactory中的源。
SlingHttpServletResponse適用於:
ContentHandler (XML) |
如果這是吊索重寫回應。 |
頁 面適應:
資源 |
頁面資源。 |
LakedResource | 標籤資源(==此)。 |
節點 | 頁面的節點。 |
... | 頁面資源可調整的一切。 |
元 件適應:
資源 | 元件的資源。 |
---|---|
LakedResource | 標籤資源(==此)。 |
節點 | 元件的節點。 |
… | 元件資源可適應的所有內容。 |
范 本適應:
資源 |
範本的資源。 |
LakedResource | 標籤資源(==此)。 |
節點 | 此模板的節點。 |
... | 範本資源可以調整的一切。 |
可授權、使 用者 和群組適應:
節點 | 返回用戶/組主節點。 |
---|---|
ReplicationStatus | 返回用戶/組主節點的複製狀態。 |
適 用於:
資源 | 資產的資源。 |
---|---|
節點 | 資產的節點。 |
… | 資產資源可以適應的所有項目。 |
適 用於:
資源 | 標籤的資源。 |
---|---|
節點 | 標籤的節點。 |
… | 標籤資源可以適應的一切。 |
此外,Sling / JCR / OCM也提供自訂OCM(物件內容對應)物件的 [AdapterFactory](https://sling.apache.org/site/adapters.html#Adapters-AdapterFactory)
。