我正在使用 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已询问了此问题,接受的建议如下:
<bean name="miniCartController" class="com.custom.storefrontaddon.controllers.misc.MyCustomMiniCartController"/>
SimpleUrlHandlerMapping
之类的 <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/cart/miniCart/**">miniCartController</prop>
</props>
</property>
</bean>
还有几件事不再可行:
-首先选择带有SimpleUrlHandlerMapping
或BeanNameUrlHandlerMapping
的控制器,然后根据@RequestMapping
注释缩小方法。
Spring默认在加速器店面中使用RequestMappingHandlerMapping
,并且在插件中我们引入SimpleUrlHandlerMapping
。我想了解为什么这样做有效,当我阅读过的所有其他论坛帖子都说您不能在不同的控制器中覆盖@RequestMapping
URL时,否则您将为重复的URL抛出异常。
答案 0 :(得分:0)
在我的回答中,我会假设您输入错误,并且您的意思是MyCustomMiniCartController而不是MiniCartController:
<bean name="miniCartController" class="com.custom.storefrontaddon.controllers.misc.MyCustomMiniCartController"/>
这里的事情是SimpleUrlHandlerMapping
无关,它的声明在
addon-web-spring.xml
完全没用。
在addon中重新定义miniCartController
bean会使该bean定义被addon类覆盖,因此addon类中声明的请求映射是RequestMappingHandlerMapping
所“使用的”映射。