1

我需要在不知道 catalogType 的情况下通过代码获取产品。是否可以在不传递 catalogType 的情况下检索产品?

以下是我尝试过的代码片段:

@Resource
private ProductDao productDao;
    
@Resource
    private CatalogVersionService catalogVersionService;


List<ProductModel> getProductsByCode(String code) {

    CatalogVersionModel catalogVersionModel = new CatalogVersionModel();
    catalogVersionModel.setVersion("Online");
    catalogVersionService.addSessionCatalogVersion(catalogVersionModel);
    List<ProductModel> productModels = productDao.findProductsByCode(code);

}

下面是我得到的例外:

{
    "errors": [
        {
            "message": "model CatalogVersionModel (<unsaved>) cannot be serialized due to being modified, new or removed",
            "type": "FlexibleSearchError"
        }
    ]
}

我可以知道如何解决上述问题吗?

4

2 回答 2

0

您需要指定目录,因为可能有多个目录,并且同一产品可能存在于所有这些目录中。

于 2021-10-30T17:25:03.207 回答
0

在 SAP Commerce (hybris) 中创建产品/变体时,必须将其附加到目录。

目录 ( CatalogModel) 也有一个版本(通常是分阶段的或在线的),该对象称为CatalogVersionModel

当您要检索产品/变体时,您必须指出,CatalogVersionModel因为产品代码不是在数据库中检索产品的唯一键(您可以在后台检查类型“产品”并在 XML 窗格中看到两者code 和 catalogVersion 有值unique="true"

现在在你的代码中有几个问题。

  • 您不应创建目录版本,但应使用服务检索它(请参阅DefaultCatalogVersionService
  • 您应该使用服务来检索您的产品(请参阅DefaultProductService

productService实现中,您会发现两种方法getProductForCode

  • 一种只有 sku 代码作为参数
  • 以 sku 代码和 catalogVersion 作为参数的一种

第一个方法实际上看起来像您想要的方法,但实际上它使用了您会话中的 catalogVersion。如果您在 groovy 中运行代码或在电子商务网站上使用 Java 运行代码,您的会话将有所不同。

您可以在下面找到此方法的注释

返回具有指定代码的产品。默认情况下,搜索使用当前会话用户、当前会话语言和当前活动目录版本(存储在会话中的属性 SESSION_CATALOG_VERSIONS 中)。有关修改搜索会话上下文,请参阅 FlexibleSearchQuery。

于 2021-11-04T15:57:26.293 回答