从CatalogCategoryBO获取ProjectBO将基于BusinessObjectRepositoryContext返回不同的结果

时间:2018-09-03 13:01:46

标签: intershop

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

google.com

但这并不总是能按预期工作。调试后,我发现主要原因是BusinessObjectRepositoryContext:

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());

根据调用给定方法(组织或渠道)的位置而有所不同。

此处描述了相同的问题:https://support.intershop.com/kb/index.php/Display/IS-22604

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

我们正在使用Intershop B2C版本7.9.1.2。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

如果您查看rest api的工作方式(请参阅ProductListResource),则它们将调用ProductHandler(请参阅ProductHandlerImpl)方法: getProducts(Domain currentChannel, CatalogCategoryBO category, String searchTerm, String localeId,...)

似乎只有类别参数是强制性的,其他参数可以为null。另一个好处是该代码将调用Solr索引(如果已启用它),因此它的性能应比在数据库上运行查询更好(这也是可能的)。