Modo efficiente per ottenere l'elenco di EntityModel (Java, DXA 2.0)
Oct 28 2020
Abbiamo una pagina che interroga entità con determinati criteri.
Il modo in cui lo implementiamo è ottenere l'elenco di ID entità, eseguire il loop degli ID, recuperare il modello entità per ID e aggiungerlo all'elenco.
Pseudo codice:
Query query = new Query(...);
// Get list of ids from query
List<String> ids = Arrays.asList(query.executeQuery());
final WebComponentMetaFactory cmf = new WebComponentMetaFactoryImpl(brokerQuery.getPublicationId());
// Get component meta
List<ComponentMeta> componentMetas = ids.stream().map(cmf::getMeta)
.collect(Collectors.toList());
// Get entity model per component and add it to the list
componentMetas.forEach(meta -> {
EntityModel entityModel = contentProvider.getEntityModel(meta.getId() + templateId, webRequestContext.getLocalization())
list.add(entityModel)
});
Funziona, tuttavia dal punto di vista delle prestazioni è molto lento perché ha bisogno di chiamare contentProvider.getEntityModel(...)ogni ID.
C'è una soluzione migliore per questo? Forse un'API da DXA che genera un elenco di EntityModel?
Risposte
Velmurugan Nov 03 2020 at 06:06
Utilizza l'API CIL di seguito per recuperare più contenuti DCP con una singola chiamata. L'esempio fornito di seguito è basato su un'API simile a .NET disponibile anche in java.
string[] componentUris = query.ExecuteQuery();
var components =
componentUris
.Select(componentUri => { TcmUri uri = new TcmUri(componentUri); return (ComponentPresentation)new ComponentPresentationFactory(uri.PublicationId).FindAllComponentPresentations(componentUri)[0]; })
.Where(cp => cp != null)
.Select(cp => cp.Content)
.ToList();
Spero possa essere d'aiuto.