Efektywny sposób pobierania listy EntityModel (Java, DXA 2.0)
Mamy stronę, która wysyła zapytania do jednostek o określonych kryteriach.
Sposób, w jaki to implementujemy, polega na pobraniu listy identyfikatorów jednostek, zapętleniu identyfikatorów, pobraniu modelu jednostki według identyfikatora i dodaniu go do listy.
Pseudo kod:
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)
});
To działa, jednak z punktu widzenia wydajności jest bardzo powolne, ponieważ wymaga wywołania contentProvider.getEntityModel(...)każdego identyfikatora.
Czy jest na to lepsze rozwiązanie? Może API z DXA, które generuje listę EntityModel?
Odpowiedzi
Użyj poniższego interfejsu API CIL, aby pobrać wiele treści DCP za pomocą jednego przykładu wywołania podanego poniżej, opartego na podobnym interfejsie API .NET, dostępnym również w języku 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();
Mam nadzieję, że to pomoże.