Hybris OOTB ProductService无法检索到已存在产品的问题咨询
这种情况在Hybris开发中非常常见,我整理了几个最可能的原因,你可以按顺序排查:
会话上下文与Catalog版本不匹配
ProductService的getProductForCode方法默认会使用当前会话的活跃Catalog版本(比如Online)和站点关联的Catalog,而你在Backoffice注册的产品可能在Staged版本,或者未关联当前服务调用的站点。HAC的Flexible Search是全局查询,不会自动带上这些上下文限制。
排查建议:显式调用带CatalogVersion参数的重载方法getProductForCode(String code, CatalogVersionModel catalogVersion),指定你注册产品的Catalog版本;或者在HAC的查询中加上WHERE {catalogversion} = (SELECT {PK} FROM {CatalogVersion} WHERE {catalog} = 'xxx' AND {version} = 'Staged'),模拟服务的上下文条件。产品状态过滤差异
很多自定义或默认的ProductService实现会自动过滤掉非活跃状态的产品,比如只查询active = true、approvalStatus = APPROVED的产品。而你在HAC写的Flexible Search如果没加这些条件,会返回所有状态的产品,包括未激活、未审批的。
排查建议:在HAC的查询中加上状态条件WHERE {active} = true,看看是否还能查到产品;或者查看ProductService的实现类,确认是否有硬编码的状态过滤逻辑。服务方法的额外查询条件
别想当然认为服务逻辑和你写的Flexible Search完全一致!getProductForCode可能隐含了其他过滤条件:比如限制产品类型(只查GenericProduct或自定义的产品子类)、关联BaseStore(只返回当前店铺的产品)、或者过滤掉已删除的产品(removed = false)。
排查建议:开启Hybris的SQL日志(在local.properties中设置log4j2.logger.de.hybris.platform.persistence.type=DEBUG),查看getProductForCode实际执行的SQL,和你在HAC写的查询对比,就能找到差异点。ACL访问控制限制
HAC的查询是用管理员权限执行的,能绕过大部分ACL(访问控制列表)限制,但ProductService的调用主体(比如前台用户、后台操作的非管理员用户)可能没有读取这些产品的权限。比如你注册的产品所在的Catalog或分类设置了ACL,服务调用的用户没有读取权限,就会返回空。
排查建议:在HAC中切换到服务调用的用户权限执行Flexible Search,看看是否还能查到产品;或者检查产品、Catalog的ACL配置。缓存未更新
Hybris的Session Cache和Region Cache可能会缓存旧的数据,你在Backoffice新增产品后,缓存没有及时刷新,导致ProductService读取缓存时找不到数据,而HAC的查询直接访问数据库。
排查建议:在HAC的Monitoring > Cache页面清空相关缓存;或者重启Hybris服务器,强制刷新缓存。Catalog版本未同步
如果你的产品在Staged版本创建后,没有同步到Online版本,而服务调用的是Online版本的Catalog,自然查不到。HAC如果查询的是Staged版本,就能看到产品,但服务默认用Online的话就不行。
排查建议:在Backoffice中检查产品的Catalog版本,执行Staged到Online的同步操作,再调用服务试试。
内容的提问来源于stack exchange,提问作者Nexussim Lements

