问题描述
据我所知,从 SAP Commerce Cloud 2005 开始,在 SAP Commerce Cloud for Spartacus 中自定义 REST 端点的方法是使用 commercewebservices(非模板),然后使用 REST 端点添加自己的 occ 扩展。
这适用于新端点,但如果我想从 commercewebservices 中自定义现有控制器怎么办?由于我不再使用该模板,因此不能再修改 commercewebservices。例如,我不知道如何自定义 de.hybris.platform.commercewebservices.core.v2.controller.CartsController。
使用从模板生成的您自己的扩展程序交换 commercewebservices 不起作用,因为多个 OOTB(例如 cmsocc)扩展程序依赖于 commercewebservices,因此它总是会被加载并与我们自己从 commercewebservices 派生的扩展程序发生冲突。
使用 addOn 自定义 commercewebservices 也不能解决问题,因为据我所知,不可能添加您自己的控制器并将其绑定到 commercewebservices 中的控制器已使用的 url 模式
解决方法
如果您想覆盖现有的 API 端点(在我们的例子中为 CartsController
),您可以使用 @RequestMappingOverride
注释来实现。
使用此注释,您可以在您自己的 OCC 扩展中“隐藏”开箱即用控制器与自定义控制器的现有请求映射。
您可以在此处找到更多详细信息和示例:
Overriding the REST API [help.sap.com]
编辑
我们不要忘记:
无论如何,所有操作都发生在外观中,您还可以使用 WsDTO 概念和额外的转换器扩展 API 响应,而无需覆盖控制器。 (有关详细信息,请参阅 Extending Data Objects[help.sap.com])
感谢您的回复。
注解 RequestMappingOverride 工作正常。这种方法有一个问题,假设我执行以下操作:
- 引入一个新的名为 MyController 的扩展 CartsController
- 覆盖单个方法并使用 RequestMappingOverride 注释此方法
- 启动系统我现在得到了 CartsController 的所有映射上的不明确映射,我没有覆盖这些映射
原因是,我现在有两个使用相同映射注册的控制器。 CartsController 和 MyController 继承了所有未被 CartsController 覆盖的方法。我找到的唯一解决方案是覆盖 CartsController 的每个方法,使用 RequestMappingOverride 注释所有方法,然后执行超级调用。这有点笨拙,会导致大量样板代码。我希望注释 RequestMappingOverride 可以在类级别而不是仅在方法级别工作