【问题标题】:Customizing Hybris accelerator storefront controllers in an addon在插件中自定义 Hybris 加速器店面控制器
【发布时间】:2019-04-29 13:00:00
【问题描述】:

我正在使用 Hybris 6.3,并希望遵循使用插件自定义加速器店面控制器的最佳实践。这样做是为了更轻松地升级到新店面。

例如,加速器定义了一个 Minicart 控制器,类似于

package com.custom.storefront.controllers.misc;

@Controller
public class MiniCartController extends AbstractController
{
    @RequestMapping(value = "/cart/miniCart/{totalDisplay:.*}", method = RequestMethod.GET)
    public String getMiniCart(@PathVariable final String totalDisplay, final Model model)
    {
        //default functionality
    }
}

在我的插件中,我想将相同的 URL 模式映射到将覆盖该功能的新控制器。

package com.custom.storefrontaddon.controllers.misc;

@Controller
public class MyCustomMiniCartController extends AbstractController
{
    @RequestMapping(value = "/cart/miniCart/{totalDisplay:.*}", method = RequestMethod.GET)
    public String getMiniCart(@PathVariable final String totalDisplay, final Model model)
    {
        //overriding functionality, different from the default accelerator storefront
    }
}

这个问题已经被问到here,接受的建议是这样做的:

  • addon-web-spring.xml 中,像这样覆盖控制器 bean
    <bean name="miniCartController" class="com.custom.storefrontaddon.controllers.misc.MyCustomMiniCartController"/>
  • addon-web-spring.xml中,添加SimpleUrlHandlerMappinglike
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/cart/miniCart/**">miniCartController</prop>
            </props>
        </property>
    </bean>
  • 现在将调用插件控制器而不是目标 URL 的默认加速器控制器。

我的问题

Spring documentation 明确表示时,这种机制是如何工作的

还有几件事不再可能:
- 先用SimpleUrlHandlerMappingBeanNameUrlHandlerMapping 选择控制器,然后根据@RequestMapping 注释缩小方法。

Spring 在加速器店面默认使用RequestMappingHandlerMapping,在插件中我们引入了SimpleUrlHandlerMapping。我想了解为什么会这样,当我读过的所有其他论坛帖子都说你不能在不同的控制器中覆盖 @RequestMapping URL,否则你会为重复的 URL 抛出异常。

【问题讨论】:

    标签: spring-mvc hybris


    【解决方案1】:

    在我的回答中,我认为你打错了,你的意思是 MyCustomMiniCartController 而不是 MiniCartController:

    <bean name="miniCartController" class="com.custom.storefrontaddon.controllers.misc.MyCustomMiniCartController"/>
    

    这里的事情是SimpleUrlHandlerMapping 无关,它的声明在 addon-web-spring.xml 完全没用。

    在插件中重新定义 miniCartController bean 会使 bean 定义被插件类覆盖,因此在插件类中声明的请求映射是 RequestMappingHandlerMapping“使用”的映射。

    【讨论】:

    • 奇怪的是,SAP 自己的覆盖控制器 bean 的插件还使用相关的 URL 模式定义了 SimpleUrlHandlerMapping,并且一些附加拦截器也附加到它。几个示例是 b2ctelcocheckoutaddon 和 subscriptionstorefront(附加拦截器)。正如您所指出的,SimpleUrlHandlerMapping 是在 RequestMappingHandlerMapping 的定义之后定义的,因此 Spring 将按照定义顺序咨询它们以获取映射分辨率,并且永远不会咨询 SimpleUrlHandlerMapping,因为 RequestMappingHandlerMapping 可以返回匹配项。
    • 如果您同意解释并测试成功,可以接受答案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 2023-03-25
    • 2015-09-05
    相关资源
    最近更新 更多