1

我们正在尝试使用以下代码从 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。

4

2 回答 2

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

于 2018-09-03T15:36:01.577 回答
0

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

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

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

于 2018-09-03T14:25:50.977 回答