在插件中自定义 Hybris 加速器店面控制器

Customizing Hybris accelerator storefront controllers in an addon

我正在使用 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
    }
}

此问题已被问到 ,接受的建议如下:

    <bean name="miniCartController" class="com.custom.storefrontaddon.controllers.misc.MyCustomMiniCartController"/>
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/cart/miniCart/**">miniCartController</prop>
            </props>
        </property>
    </bean>

我的问题

Spring documentation 明确指出

时,该机制如何工作

There are also several things no longer possible:
- Select a controller first with a SimpleUrlHandlerMapping or BeanNameUrlHandlerMapping and then narrow the method based on @RequestMapping annotations.

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

在我的回答中,我假设您打错了字,您指的是 MyCustomMiniCartController 而不是 MiniCartController:

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

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

在插件中重新定义 miniCartController bean 会使 bean 定义被插件 class 覆盖,因此在插件 class 中声明的请求映射是 [= =21=] 由 RequestMappingHandlerMapping.