Получение ProjectBOs из CatalogCategoryBO возвращает разные результаты на основе BusinessObjectRepositoryContext - PullRequest
0 голосов
/ 03 сентября 2018

Мы пытаемся получить все 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 ]

0 голосов
/ 03 сентября 2018

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

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

https://support.intershop.com/kb/index.php/Display/2X3516#Concept-ApplicationFramework-TheExecutionContextofanApplication

0 голосов
/ 03 сентября 2018

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

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

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

...