我正处于将 JBoss 5 安装更新到 JBoss 6.1.0.Alpha 的痛苦过程的尾声。JBoss 5 安装中不存在此问题。
版本:
- Spring 3.2.3.RELEASE
- JBoss EAP 6.1.0.Alpha1 (AS7.2.0.Alpha1-redhat-4)
- 带有 mod_proxy 的 Apache 2.2
控制器层次结构仍然使用旧org.springframework.web.servlet.mvc.SimpleFormController
的作为基本控制器。
当发布大量表单数据(不是很大;表的 326 行)时,出现在控制器中的域对象(通过 MVC 编组重新水合)已被截断 - 并非所有对象都出现。如调试器中所见,以及由此产生的部分更新的屏幕。
所有数据都可以在 Chrome 中以帖子内的表单数据形式显示,如Content-Type:application/x-www-form-urlencoded
.
但是在服务器上,Spring Web MVC 从发布的数据创建的对象停止在 246 左右。就好像已经达到了某个上限,并且在那个时候数据被截断了。
请注意,这似乎不是“路径错误中的点”。我已添加此配置无济于事:
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="useDefaultSuffixPattern" value="false" />
</bean>
我已经尝试删除发生截止的任何一侧的一些项目(243 到 249),以防数据中有一些奇怪的东西,但这样做仍然会导致大约 246 个项目到达控制器。
JBoss HTTP 连接器已配置为允许最大 100mb,甚至 1000mb 用于发布(比发布的数据大得多)。
我怀疑这是一个 Spring 配置问题,但我已经仔细研究了文档并提出了干货。
编辑:
Spring MVC 似乎是无辜的。使用 Eclipse,我在运行时回溯调用堆栈,以找到可以看到请求的最早调用:
然后选择request
变量->右键单击->编辑详细格式化程序...
使用添加了此代码System.out
(因为调试 UI 的输出被 Eclipse 截断):
java.util.Enumeration paramNames = getParameterNames();
while (paramNames.hasMoreElements()) {
System.out.println(paramNames.nextElement());
}
它输出Request
对象拥有的所有参数。
果然,“选定”属性(必须选择表单中的每一行才能对这个屏幕产生任何影响)在 245 处停止(我在这里对输出进行了排序):
itemSearchFilter.results[244].selected
itemSearchFilter.results[245].selected
itemSearchFilter.results[24].selected
itemSearchFilter.results[25].selected
所以这看起来像是 Apache 和 JBoss 之间的配置问题,因为据我所知,Spring 还没有机会与这个Request
实例进行交互(从上面显示的调用堆栈来看,它肯定不像它) .
这是mod_proxy
来自 Apache 的配置http.conf
<IfModule mod_proxy.c>
ProxyRequests Off
<Proxy *>
AddDefaultCharset off
Order deny,allow
Allow from all
</Proxy>
ProxyVia On
ProxyPass /a-mgt http://localhost:8080/a-mgt
ProxyPassReverse /a-mgt http://localhost:8080/a-mgt
</IfModule>
这是来自 JBoss 的 HTTP 连接器配置standalone-full.xml
<subsystem xmlns="urn:jboss:domain:web:1.4" default-virtual-server="default-host" native="false">
<configuration>
<jsp-configuration development="true" check-interval="1"
modification-test-interval="1" recompile-on-fail="true"/>
</configuration>
<connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http"
max-post-size="1048576000" max-save-post-size="0" max-connections="1000"/>
<virtual-server name="default-host" enable-welcome-root="true">
<alias name="localhost"/>
</virtual-server>
</subsystem>
<subsystem xmlns="urn:jboss:domain:threads:1.1">
<bounded-queue-thread-pool name="http-executor">
<core-threads count="100"/>
<queue-length count="10"/>
<max-threads count="1000"/>
<keepalive-time time="20" unit="seconds"/>
</bounded-queue-thread-pool>
</subsystem>
<socket-binding-group name="standard-sockets"
default-interface="public"
port-offset="${jboss.socket.binding.port-offset:0}">
<socket-binding name="http" port="8080"/>
</socket-binding-group>