【问题标题】:simple Spring portlet not working at Action mapping at liferay 6.2简单的 Spring Portlet 在 Liferay 6.2 的操作映射中不起作用
【发布时间】:2026-02-08 04:00:02
【问题描述】:

一个在 LifeRay 6.0 和 Open Portlet Container 中正常运行的简单 portlet,但是当我部署到 Liferay 6.2 时,它在操作映射时中断。我在调试时发现了这两个问题。 1)表单数据在操作方法中不可用(未填充) 2) 无法使用 setRenderParameter 进入带参数的渲染方法

提前感谢任何帮助。

代码示例如下 - 不包括第二个选项(即 setRenderParamer)

<portlet:defineObjects/>
<portlet:actionURL var="doFormActionURL">
   <portlet:param name="action" value="doFormAction" />
</portlet:actionURL>



  <form:form name="form" modelAttribute="someObject" method="post"  action="${doFormActionURL}" htmlEscape="false" >
   <table>
  <tr>
    <td><form:input path="id" /></td>
  </tr>
  <tr>
    <td><form:input path="name" /></td>
  </tr>
   </table>
<input type="submit" value="Just do it" />
 </form:form>

在控制器中

@Controller
@RequestMapping("VIEW")
public class ControllerMain
{

@RenderMapping
public String setModelAndView(PortletRequest request, Model model) {

    model.addAttribute("someObject", new SomeObject());
    return "home";
 }

@ActionMapping(params = "action=doFormAction")
public void doFormAction(@ModelAttribute ("someObject") SomeObject someObject, ActionRequest request) {
    String strname = request.getParameter("name");
    System.out.println("someObject : "+someObject.toString());
    System.out.println("name : "+strname);


}

上下文

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!-- property name="cache" value="true" /-->
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
    <property name="requestContextAttribute"><value>rc</value></property>
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
</bean>

输出:

一些对象:0 无效的 无效的 名称:空

有人在 liferay 6.2 上尝试过 spring 吗?请分享您的经验

【问题讨论】:

  • 你是如何让这个 portlet 兼容 6.2 版本的?
  • 嗨Pankaj,感谢您的回复,正在开发中.. 1)liferay(6.0和6.2)配置了liferay-eclipse ide,因此在部署时配置了直接部署2)导出战争,日食提供选项('优化服务器运行时')我提供liferay 6.0 / 6.2选项(预配置)
  • 渲染没有问题,但实际操作中问题仍然存在

标签: spring-mvc portlet liferay-6


【解决方案1】:

但是从Liferay插件的github代码中发现Sample Spring portlet的liferay-portlet.xml有一些变化。

尝试以下更改。 在 liferay-portlet.xml 中设置为 false,然后通过部署 portlet 重试。

<portlet>
    <portlet-name>welcome</portlet-name>
    <requires-namespaced-parameters>false</requires-namespaced-parameters>
</portlet>

参考来自 Liferay github 代码的 Sample Spring Portlet 代码。 LR 6.1 - https://github.com/liferay/liferay-plugins/blob/6.1.x/portlets/sample-spring-portlet/docroot/WEB-INF/liferay-portlet.xml

LR 6.2 - https://github.com/liferay/liferay-plugins/blob/6.2.x/portlets/sample-spring-portlet/docroot/WEB-INF/liferay-portlet.xml

【讨论】:

  • 感谢您的努力。 requires-namespaced-parameters 条目解决了这个问题。实际上,您和辍学者都在尝试他们的水平,并为我带来了正确的解决方案。我对你们两个都同样尊重,但由于你的答案早于辍学,我将其标记为答案。
  • 这节省了我一天的问题:-)
【解决方案2】:

您应该将命名空间前缀添加到您的 name 值,如下所示:

<input type="text" name="<portlet:namespace />inputTextName" />

或者您可以在您的liferay-portlet.xml 中将requires-namespaced-parameters 设置为false。

这是自 Liferay 6.2 以来的更改:https://github.com/liferay/liferay-aui-upgrade-tool/issues/30

【讨论】:

  • 感谢 Dropout 的宝贵贡献。我认为将命名空间放在表单元素级别很累,但可以使用 liferay-portlet.xml