此错误来自码头Request 实现。
如果您查看Request#extractFormParameters 方法的来源,您将看到以下内容:
if (_context != null)
{
maxFormContentSize = _context.getContextHandler().getMaxFormContentSize();
maxFormKeys = _context.getContextHandler().getMaxFormKeys();
}
if (maxFormContentSize < 0)
{
Object obj = _channel.getServer().getAttribute("org.eclipse.jetty.server.Request.maxFormContentSize");
if (obj == null)
maxFormContentSize = 200000;
else if
...
}
所以,实际上,您可以真正将您的上下文值设置为 pikand 建议的0,或者设置服务器配置如下:
<Configure id="Server" class="org.eclipse.jetty.server.Server">
<Call name="setAttribute">
<Arg>org.eclipse.jetty.server.Request.maxFormContentSize</Arg>
<Arg>-1<!-- or 0, or any lt 0 --></Arg>
</Call>
...
</Configure>
根据此代码稍后会抛出您的异常:
if (contentLength > maxFormContentSize && maxFormContentSize > 0)
{
throw new IllegalStateException("Form too large: " + contentLength + " > " + maxFormContentSize);
}
所以,你可以看到,maxFormContentSize 可能是<= 0 不抛出这个异常。
我认为,没有必要通过 ajax 进行更新。但实际上最好限制数据大小,而不是让用户放下你的服务器。
其他应用程序服务器有自己的设置,对于大多数应用程序服务器,您应该将maxPostSize 值设置为零,以禁用此限制。
另外,检票口Form 组件有它自己的maxSize 属性,你可以用Form#setMaxSize 设置它。问题是Form 将此值作为Bytes 值传输到FileUploadBase 类,该类具有下一个javadoc:
完整请求允许的最大大小,而不是
文件大小最大值。 -1 值表示没有最大值。
实际上这个参数是通过fileUpload.setSizeMax(maxSize.bytes());设置的,Bytes不能保持负值。但我认为您可以尝试将其设置为0 并检查它是否有效。默认情况下,Form#getSizeMax() 方法检查:
return getApplication().getApplicationSettings().getDefaultMaximumUploadSize();
返回Bytes.MAX,等于8388608 terabytes。我认为,这将是“无限制”值:)
另外,据我所知 - 您无需设置表单 ID,即可使用 multipart 参数。仅当您通过 ajax 更新表单时,您必须设置 Form.setOutputMarkupId(true)。但实际上Form如果是multipart的话,会在renderHead方法中自己创建id:
// register some metadata so we can later properly handle multipart ajax posts for
// embedded forms
registerJavaScriptNamespaces(response);
response
.render(JavaScriptHeaderItem.forScript("Wicket.Forms[\"" + getMarkupId()
+ "\"]={multipart:true};", Form.class.getName() + '.' + getMarkupId()
+ ".metadata"));
注意,getMarkupId() 方法会在不存在的情况下创建标记 ID。