Utilizzo di adattatori Sling using-sling-adapters
Sling offre un pattern di adattatore per tradurre in modo comodo gli oggetti che implementano l'interfaccia Adaptable. Questa interfaccia fornisce un metodo adaptTo() generico che converte l'oggetto nel tipo di classe passato come argomento.
Ad esempio, per tradurre un oggetto Resource nell’oggetto Node corrispondente, puoi semplicemente effettuare le seguenti operazioni:
Node node = resource.adaptTo(Node.class);
Casi d’uso use-cases
Sono disponibili i seguenti casi d’uso:
-
Ottieni oggetti specifici per l’implementazione.
Ad esempio, un'implementazione JCR dell'interfaccia generica
Resource
fornisce l'accesso al JCR sottostanteNode
. -
Creazione di collegamenti di oggetti che richiedono il passaggio di oggetti contestuali interni.
Ad esempio, il
ResourceResolver
basato su JCR contiene un riferimento alJCR Session
della richiesta, che a sua volta è necessario per molti oggetti che funzionano in base alla sessione di richiesta, ad esempioPageManager
oUserManager
. -
Collegamento ai servizi.
Un caso raro -
sling.getService()
è semplice.
Valore restituito nullo null-return-value
adaptTo()
Può restituire Null.
Esistono diversi motivi per il ritorno a valori nulli, tra cui i seguenti:
- l’implementazione non supporta il tipo di target
- un adapter factory che gestisce questo caso non è attivo (ad esempio, a causa di riferimenti di servizio mancanti)
- condizione interna non riuscita
- servizio non disponibile
È importante gestire il caso nullo in modo corretto. Per i rendering JSP, potrebbe essere accettabile che l’esecuzione di JSP non riesca se si verifica una parte di contenuto vuota.
Memorizzazione in cache caching
Per migliorare le prestazioni, le implementazioni possono memorizzare nella cache l'oggetto restituito da una chiamata obj.adaptTo()
. Se obj
è lo stesso, l'oggetto restituito è lo stesso.
Questa memorizzazione nella cache viene eseguita per tutti i AdapterFactory
casi basati su.
Tuttavia, non esiste una regola generale: l’oggetto potrebbe essere una nuova istanza o una esistente. Di conseguenza, non puoi fare affidamento su nessuno dei due comportamenti. È quindi importante, soprattutto all'interno di AdapterFactory
, che gli oggetti siano riutilizzabili in questo scenario.
Come funziona how-it-works
È possibile implementare Adaptable.adaptTo()
in vari modi:
-
Dall'oggetto stesso, implementando il metodo stesso e mappando a determinati oggetti.
-
Da un
AdapterFactory
, che può mappare oggetti arbitrari.Gli oggetti devono ancora implementare l'interfaccia
Adaptable
e devono estendereSlingAdaptable
(che trasmette la chiamataadaptTo
a un gestore adapter centrale).Questo metodo consente gli hook nel meccanismo
adaptTo
per le classi esistenti, ad esempioResource
. -
Una combinazione di entrambi.
Nel primo caso, i documenti Java™ possono indicare le adaptTo-targets
possibili. Tuttavia, per sottoclassi specifiche come la risorsa basata su JCR, questa istruzione spesso non è possibile. In quest'ultimo caso, le implementazioni di AdapterFactory
fanno generalmente parte delle classi private di un bundle e quindi non sono esposte in un'API client, né elencate nei documenti Java™. In teoria, è possibile accedere a tutte le implementazioni di AdapterFactory
dal runtime del servizio OSGi e visualizzarne le configurazioni di "adattabili" (origini e destinazioni), ma non mapparle tra loro. Alla fine, dipende dalla logica interna, che deve essere documentata. Da qui questo riferimento.
Riferimento reference
Sling sling
La risorsa si adatta a:
ResourceResolver si adatta a:
SlingHttpServletRequest si adatta a:
Ancora nessuna destinazione, ma implementa Adaptable e potrebbe essere utilizzato come origine in un AdapterFactory personalizzato.
SlingHttpServletResponse si adatta a:
WCM wcm
La pagina si adatta a:
Il componente si adatta a:
Il modello si adatta a:
Sicurezza security
Autorizzabile, Utente e Gruppo si adattano a:
DAM dam
Risorsa si adatta a:
Assegnazione dei tag tagging
Tag si adatta a:
Altro other
Inoltre, Sling / JCR / OCM fornisce anche un AdapterFactory
per gli oggetti OCM personalizzati (Object Content Mapping).