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
Resourcefornisce l'accesso al JCR sottostanteNode. -
Creazione di collegamenti di oggetti che richiedono il passaggio di oggetti contestuali interni.
Ad esempio, il
ResourceResolverbasato su JCR contiene un riferimento alJCR Sessiondella richiesta, che a sua volta è necessario per molti oggetti che funzionano in base alla sessione di richiesta, ad esempioPageManageroUserManager. -
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
Adaptablee devono estendereSlingAdaptable(che trasmette la chiamataadaptToa un gestore adapter centrale).Questo metodo consente gli hook nel meccanismo
adaptToper 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:
Protezione security
Autorizzabile, Utente e Gruppo si adattano a:
DAM dam
Risorsa si adatta a:
Assegnazione tag tagging
Tag si adatta a:
Altro other
Inoltre, Sling / JCR / OCM fornisce anche un AdapterFactory per gli oggetti OCM personalizzati (Object Content Mapping).