【发布时间】: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 明确表示时,这种机制是如何工作的
还有几件事不再可能:
- 先用SimpleUrlHandlerMapping或BeanNameUrlHandlerMapping选择控制器,然后根据@RequestMapping注释缩小方法。
Spring 在加速器店面默认使用RequestMappingHandlerMapping,在插件中我们引入了SimpleUrlHandlerMapping。我想了解为什么会这样,当我读过的所有其他论坛帖子都说你不能在不同的控制器中覆盖 @RequestMapping URL,否则你会为重复的 URL 抛出异常。
【问题讨论】:
标签: spring-mvc hybris