Получение ProjectBOs из CatalogCategoryBO возвращает разные результаты на основе BusinessObjectRepositoryContext

Мы пытаемся получить все ProductBOs из CatalogCategoryBO со следующим кодом:

final CatalogBORepository catalogBORepository = applicationBO.getRepository("CatalogBORepository");
final CatalogCategoryBO catalogCategoryBO = catalogBORepository.getCatalogBOByCatalogName(catalogName).getCatalogCategoryBOByName(catalogCategoryName);
final CatalogCategoryBOCommonProductAssignmentExtension assignmentExtension = catalogCategoryBO.getExtension(CatalogCategoryBOCommonProductAssignmentExtension.class);
return assignmentExtension.getSortedProducts(applicationBO.getDefaultLocale());

Но это не всегда работает, как ожидалось. После отладки я обнаружил, что основной причиной является BusinessObjectRepositoryContext:

((BusinessObjectRepositoryContext)catalogCategoryBO.getContext().getVariable("CurrentBusinessObjectRepositoryContext");

который отличается в зависимости от местоположения, из которого мы называем данный метод (организация или канал).

Та же проблема описана здесь: https://support.intershop.com/kb/index.php/Display/IS-22604

Есть ли обходной путь или лучший способ получить все назначенные ProductBO из CatalogCategoryBO?

Мы используем Intershop B2C версии 7.9.1.2.

2 ответа

Решение

Одна возможность состоит в том, чтобы вызвать конвейер для получения продуктов, как предложено Виллемом Эвертсе, другая возможность - извлечь CatalogBORepository и CatalogCategoryBO в блоке:

try (ApplicationContext applicationContext = application.forceApplicationContext()) {
    // your code here
}

https://support.intershop.com/kb/index.php/Display/2X3516

Да, это потому, что бизнес-объекты могут иметь разные реализации в зависимости от контекста (приложения).

Если вы посмотрите, как остальные API это делает (см. ProductListResource) они называют ProductHandler (увидеть ProductHandlerImpl) метод:getProducts(Domain currentChannel, CatalogCategoryBO category, String searchTerm, String localeId,...)

Кажется, только параметр категории является обязательным, остальные параметры могут быть нулевыми. Дополнительным преимуществом является то, что этот код будет вызывать индекс Solr (если он у вас включен), поэтому он должен работать лучше, чем выполнение запроса к базе данных (что также возможно).

Другие вопросы по тегам