Эффективный способ получения списка EntityModel (Java, DXA 2.0)
У нас есть страница, которая запрашивает объекты по определенным критериям.
Мы реализуем это путем получения списка идентификаторов сущностей, цикла идентификаторов, получения модели сущности для каждого идентификатора и добавления ее в список.
Псевдокод:
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)
});
Это работает, однако с точки зрения производительности происходит очень медленно, потому что необходимо вызывать contentProvider.getEntityModel(...)каждый идентификатор.
Есть ли лучшее решение для этого? Возможно, API от DXA, который генерирует список EntityModel?
Ответы
Используйте этот ниже CIL API для извлечения множественного содержимого DCP с помощью одного вызова. Пример, приведенный ниже, основан на аналогичном API .NET, также доступном в 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();
Я надеюсь, что это помогает.