从 CatalogCategoryBO 获取 ProjectBO returns 基于 BusinessObjectRepositoryContext 的不同结果

Getting ProjectBOs from CatalogCategoryBO returns different results based on BusinessObjectRepositoryContext

我们正在尝试使用以下代码从 CatalogCategoryBO 中获取所有 ProductBO:

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

是否有一些解决方法或更好的方法从 CatalogCategoryBO 获取所有已分配的 ProductBO?

我们使用的是 Intershop B2C 版本 7.9.1.2。

是的,这是因为业务对象可以根据上下文(应用程序)有不同的实现。

如果你看看其余 api 是如何做到的(参见 ProductListResource),他们调用 ProductHandler(参见 ProductHandlerImpl)方法: getProducts(Domain currentChannel, CatalogCategoryBO category, String searchTerm, String localeId,...)

好像只有category参数是必须的,其他参数可以为null。额外的好处是这段代码将调用 Solr 索引(如果你启用了它)所以它应该比 运行 对数据库的查询(这也是一种可能性)执行得更好。

一种可能性是按照 Willem Evertse 的建议调用管道获取产品,另一种可能性是在块内获取 CatalogBORepository 和 CatalogCategoryBO:

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

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