Spring MVC Controller作为Liferay Portlet和Servlet

时间:2015-08-06 15:41:43

标签: java spring spring-mvc liferay portlet

我们正在尝试使用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个控制器。

谢谢。

1 个答案:

答案 0 :(得分:2)

我真的不认为这是一个好主意...类级别的@RequestMapping注释肯定会导致问题,因为Spring portlet MVC期望portlet模式,而Spring Web MVC需要一个根URL。

此外,您的代码似乎也不正确,因为ModelAndView作为Spring框架的portlet MVC部分存在window.getUnits(el, 'width'),并且因为您无法同时导入,你必须为其中一个指定完整的包,既然你没有这样做,你的代码也是错的。

除了技术问题,portlet和servlet都有不同的术语和观点。如果我听到这些话,这些是一些关键问题:

  • 您打算如何处理不同阶段(ACTION和RENDER)
  • 不同的portlet模式(VIEW,EDIT,HELP,...)
  • 您打算如何处理特定的portlet功能(PortletSession,PortletPreferences,...)
  • 你将如何处理不同类型的请求(ResourceRequest,ActionRequest,RenderRequest,PortletRequst,EventRequest vs HttpServletRequest)
  • 你打算如何处理安全问题?门户网站容器为您提供身份验证,而独立的Web应用程序则不提供身份验证。

这些只是来自portlet心态的问题,如果从Web应用程序的角度来看,我很确定也存在技术问题。

将代码划分为视图层和业务逻辑更有意义。将业务逻辑放在单独的包或单独的服务中,并使用相同/共享的业务逻辑构建单独的portlet和独立应用程序。