2

我正处于将 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>
4

1 回答 1

0

事实证明,JBoss HTTP 连接器使用的 HTTP 参数数量是有限制的,令人沮丧的是,无法通过我在问题中提出的 XML 片段进行配置。

相反,它必须standalong-full.xml作为系统属性添加:

...
</extensions>

<system-properties>
    <property name="org.apache.tomcat.util.http.Parameters.MAX_COUNT" value="5000"/>
</system-properties>

<management>
...

为什么这不能从 HTTP 连接器配置或至少在那里记录...

我在这个 JBoss 社区线程上找到了解决方案。

于 2013-10-16T13:12:29.943 回答