我们正在尝试使用spring MVC Controller作为portlet 和作为servlet,以便部署在Liferay上下文中或作为独立版本。但是如果我们决定在方法级别上有多个RequestMappings(而不是在控制器级别上只有1个映射),那么我们就会发生冲突。我们得到如下所示的错误。
请注意,如果我们决定在承载servlet映射和 portlet映射的控制器级别上拥有requestMapping,那么它就可以工作。
@RequestMapping({"view", "/"})
无效的控制器:
@Controller("controller")
@RequestMapping("VIEW")
public class MyController {
@RenderMapping
public ModelAndView doView(RenderRequest request, RenderResponse response) throws Exception {
HttpServletRequest portletHttpReq = PortalUtil.getHttpServletRequest(request);
HttpServletResponse portletHttpResp = PortalUtil.getHttpServletResponse(response);
return doView(portletHttpReq, portletHttpResp);
}
@RequestMapping(value="/home")
protected ModelAndView doView(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
// do something
return new ModelAndView("view");
}
}
产生的错误:
[...] 引起:java.lang.IllegalStateException:方法和类型级别之间的模式映射冲突:[/ home]与[view]
您对我们如何实施此类事项有任何建议吗?我们真正想要避免的是必须为每个portlet / servlet维护2个控制器。
谢谢。
答案 0 :(得分:2)
我真的不认为这是一个好主意...类级别的@RequestMapping
注释肯定会导致问题,因为Spring portlet MVC期望portlet模式,而Spring Web MVC需要一个根URL。
此外,您的代码似乎也不正确,因为ModelAndView
作为Spring框架的portlet MVC部分存在window.getUnits(el, 'width')
,并且因为您无法同时导入,你必须为其中一个指定完整的包,既然你没有这样做,你的代码也是错的。
除了技术问题,portlet和servlet都有不同的术语和观点。如果我听到这些话,这些是一些关键问题:
这些只是来自portlet心态的问题,如果从Web应用程序的角度来看,我很确定也存在技术问题。
将代码划分为视图层和业务逻辑更有意义。将业务逻辑放在单独的包或单独的服务中,并使用相同/共享的业务逻辑构建单独的portlet和独立应用程序。