Liferay表单功能Bug:无法创建超过28个项的表单
Liferay CE 7.4.32表单无法添加超过28个项的问题修复方案
问题概述
使用Liferay CE 7.4.32时,创建表单添加超过28个字段后无法保存,触发如下错误,且保存时会跳转到表单列表导致新增内容丢失:
2022-09-05 11:31:24.685 ERROR [http-nio-8080-exec-1][PortletServlet:117] null javax.portlet.PortletException: java.lang.IllegalStateException: The property "serializedFormContext" is required at com.liferay.portal.kernel.portlet.bridges.mvc.BaseTransactionalMVCActionCommand.processAction(BaseTransactionalMVCActionCommand.java:58) ~[portal-kernel.jar:?] at com.liferay.portal.kernel.portlet.bridges.mvc.MVCPortlet.callActionMethod(MVCPortlet.java:402) ~[portal-kernel.jar:?] at com.liferay.portal.kernel.portlet.LiferayPortlet.processAction(LiferayPortlet.java:82) ~[portal-kernel.jar:?] at com.liferay.portal.kernel.portlet.bridges.mvc.MVCPortlet.processAction(MVCPortlet.java:256) ~[portal-kernel.jar:?] at com.liferay.portlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:77) ~[portal-impl.jar:?] at com.liferay.portal.kernel.portlet.PortletFilterUtil.doFilter(PortletFilterUtil.java:50) ~[portal-kernel.jar:?] at com.liferay.portal.kernel.servlet.PortletServlet.service(PortletServlet.java:113) ~[portal-kernel.jar:?] at javax.servlet.http.HttpServlet.service(HttpServlet.java:764) ~[servlet-api.jar:4.0.FR] at org.eclipse.equinox.http.servlet.internal.registration.EndpointRegistration.service(EndpointRegistration.java:153) ~[?:?] at org.eclipse.equinox.http.servlet.internal.servlet.ResponseStateHandler.processRequest(ResponseStateHandler.java:62) ~[?:?] at org.eclipse.equinox.http.servlet.internal.context.DispatchTargets.doDispatch(DispatchTargets.java:120) ~[?:?] at org.eclipse.equinox.http.servlet.internal.servlet.RequestDispatcherAdaptor.include(RequestDispatcherAdaptor.java:48) ~[?:?] .... at java.lang.Thread.run(Thread.java:748) [?:1.8.0_301] Caused by: java.lang.IllegalStateException: The property "serializedFormContext" is required at com.liferay.dynamic.data.mapping.form.builder.internal.context.DDMFormContextToDDMForm.deserialize(DDMFormContextToDDMForm.java:77) ~[?:?] at com.liferay.dynamic.data.mapping.form.builder.internal.context.DDMFormContextToDDMForm.deserialize(DDMFormContextToDDMForm.java:59) ~[?:?] at com.liferay.dynamic.data.mapping.form.web.internal.portlet.action.helper.SaveFormInstanceMVCCommandHelper._getDDMForm(SaveFormInstanceMVCCommandHelper.java:222) ~[bundleFile:?] at com.liferay.dynamic.data.mapping.form.web.internal.portlet.action.helper.SaveFormInstanceMVCCommandHelper._updateFormInstance(SaveFormInstanceMVCCommandHelper.java:340) ~[bundleFile:?] at com.liferay.dynamic.data.mapping.form.web.internal.portlet.action.helper.SaveFormInstanceMVCCommandHelper.saveFormInstance(SaveFormInstanceMVCCommandHelper.java:125) ~[bundleFile:?] at com.liferay.dynamic.data.mapping.form.web.internal.portlet.action.SaveFormInstanceMVCActionCommand.doService(SaveFormInstanceMVCActionCommand.java:57) ~[bundleFile:?] at com.liferay.dynamic.data.mapping.form.web.internal.portlet.action.SaveFormInstanceMVCActionCommand.doTransactionalCommand(SaveFormInstanceMVCActionCommand.java:84) ~[bundleFile:?] at com.liferay.portal.kernel.portlet.bridges.mvc.BaseTransactionalMVCActionCommand$1.call(BaseTransactionalMVCActionCommand.java:44) ~[portal-kernel.jar:?] at com.liferay.portal.kernel.portlet.bridges.mvc.BaseTransactionalMVCActionCommand$1.call(BaseTransactionalMVCActionCommand.java:40) ~[portal-kernel.jar:?] at com.liferay.portal.spring.transaction.BaseTransactionExecutor.execute(BaseTransactionExecutor.java:37) ~[portal-impl.jar:?] at com.liferay.portal.spring.transaction.TransactionInvokerImpl.invoke(TransactionInvokerImpl.java:39) ~[portal-impl.jar:?] at com.liferay.portal.kernel.transaction.TransactionInvokerUtil.invoke(TransactionInvokerUtil.java:28) ~[portal-kernel.jar:?]
问题根源
这个错误的核心原因是Tomcat默认的请求参数个数限制(默认maxParameterCount=256)。当表单字段超过28个时,每个字段会生成多个关联参数,总参数数超过Tomcat的默认限制,导致serializedFormContext参数被截断丢失,后端验证时找不到该必填参数,从而抛出错误。
修复方案
1. 修改Tomcat参数限制配置
- 找到Liferay所用Tomcat的
conf/server.xml文件 - 在
Connector标签中添加maxParameterCount属性,设置一个足够大的值(比如1000,可根据实际表单字段数调整):
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxParameterCount="1000" />
- 重启Tomcat服务,配置生效后即可添加超过28个字段的表单。
2. 临时规避方案(无需重启服务器)
- 将大表单拆分为多个子表单,通过业务流程或关联字段整合数据
- 使用自定义开发的表单替代默认的DDM表单构建器,绕过前端参数提交限制
内容的提问来源于stack exchange,提问作者Danielly Sorato
相关产品推荐
相关产品推荐

