Эффективный способ получения списка EntityModel (Java, DXA 2.0)

Oct 28 2020

У нас есть страница, которая запрашивает объекты по определенным критериям.

Мы реализуем это путем получения списка идентификаторов сущностей, цикла идентификаторов, получения модели сущности для каждого идентификатора и добавления ее в список.

Псевдокод:

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?

Ответы

Velmurugan Nov 03 2020 at 06:06

Используйте этот ниже 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();

Я надеюсь, что это помогает.