sap-commerce-cloudhybris-data-hub

Is that possible to retrieve products without passing catalogType?


I have a requirement to get products by code without knowing catalogType. Is that possible to retrieve products without passing catalogType?

Below is the code snippet I've tried:

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

}

Below is the exception am getting:

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

May I know how to fix for above issue?


Solution

  • When you create a product/variant in SAP Commerce (hybris) you must attach it to a catalog.

    A catalog (CatalogModel) also have a version (usually staged or online), and the object is called a CatalogVersionModel

    When you want to retrieve a product/variant, you must indicate the CatalogVersionModel because the product code is not a unique key to retrieve the product in the DB (you can check the Type "Product" in the backoffice and see in the XML pane that both code and catalogVersion have the value unique="true")

    Now in you code there are several issue.

    In productService implementation, you'll find two methods getProductForCode.

    The first method actually looks like the method you want, but in fact, it uses the catalogVersion in your session. Your session will be different if you run your code in groovy or if you run your code in Java from your ecommerce website.

    You can find the comment of this method below

    Returns the Product with the specified code. As default the search uses the current session user, the currentsession language and the current active catalog versions (which are stored at the session in the attribute SESSION_CATALOG_VERSIONS).For modifying the search session context see FlexibleSearchQuery.