在插件中自定义 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
}
}
此问题已被问到 ,接受的建议如下:
- 在addon-web-spring.xml中,像
一样覆盖控制器bean
<bean name="miniCartController" class="com.custom.storefrontaddon.controllers.misc.MyCustomMiniCartController"/>
- 在addon-web-spring.xml中添加一个
SimpleUrlHandlerMapping
like
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/cart/miniCart/**">miniCartController</prop>
</props>
</property>
</bean>
- 现在将调用插件控制器,而不是目标的默认加速器控制器 URL。
我的问题
当 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
.
我正在使用 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
}
}
此问题已被问到
- 在addon-web-spring.xml中,像 一样覆盖控制器bean
<bean name="miniCartController" class="com.custom.storefrontaddon.controllers.misc.MyCustomMiniCartController"/>
- 在addon-web-spring.xml中添加一个
SimpleUrlHandlerMapping
like
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/cart/miniCart/**">miniCartController</prop>
</props>
</property>
</bean>
- 现在将调用插件控制器,而不是目标的默认加速器控制器 URL。
我的问题
当 Spring documentation 明确指出
时,该机制如何工作There are also several things no longer possible:
- Select a controller first with aSimpleUrlHandlerMapping
orBeanNameUrlHandlerMapping
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
.