如何在Liferay Portlet插件中为多个Portlet使用具有多个控制器的@RequestMapping

时间:2014-01-01 23:22:23

标签: controller annotations request liferay spring-portlet-mvc

我有一个WAR文件,其中包含两个带有专用控制器的portlet。 当我启动Liferay /调用包含两个portlet的页面时,如何配置所有控制器(处理程序方法)? 在portlet.xml中,两个portlet都可以找到 <portlet-class>org.springframework.web.portlet.DispatcherPortlet</portlet-class>

在spring-mvc-portlet.xml中,我使用<context:component-scan base-package="com.foo.bar" />

两个控制器都应该有一个使用@RenderMapping注释的默认处理程序方法。 控制器都在类型级别使用@RequestMapping(“VIEW”)进行注释。

目前发生的是只调用控制器A的默认处理程序方法(在portlet.xml中定义的第一个)。

2 个答案:

答案 0 :(得分:1)

首先,我建议您将每个portlet(控制器)放在不同的包中。

对于每个portlet,您应该从portlet.xml获得以“portlet-name”命名的spring xml文件 因此,如果你有<portlet-name>my-first-portlet</portlet-name>,你应该在WEB-INF中拥有 myfirstportlet-portlet.xml ,它具有组件扫描元素。

答案 1 :(得分:1)

问题解决了!

我解决了问题,这种方式对我有用:
我必须将每个控制器放入自己的包中。为了让Liferay意识到这一点,我必须配置portlet.xml 以某种方式为列出的每个portlet提供专用的上下文配置。因此,我复制了<myPortlet>-portlet.xml, 将其正确地重命名为<myOtherPortlet>-portlet.xml并将此名称放入。{ portlet.xml中的contextConfigParam <init-param>元素。 在上下文配置文件中,我必须修改上下文:component-scan元素,如下所示,以排除其他控制器 忽视这个控制器。例如,在我的ListController的上下文配置XML文件中,我必须排除 ImportController这样:

<context:component-scan base-package="com.foo.bar" use-default-filters="true">
    <context:exclude-filter type="assignable" expression="com.foo.bar.importer.portlet.ImportController"/>
</context:component-scan>

...在ImportController的上下文配置XML文件中,我必须相应地排除ListController。