Spring启动应用程序

时间:2017-05-10 18:44:00

标签: java spring tomcat spring-boot

我有一个春季启动应用程序,它使用多重上传来更新大量文件10K +。在那些情况下,我遇到了这个例外。我猜它正在查看我的"文件"参数并看到它是一个数组> 10K并标记此异常。我还发送了另一个参数,该参数是与文件列表相关联的字符串数组,其大小是文件数,> 10K

java.lang.IllegalStateException: More than the maximum number of request parameters (GET plus POST) for a single request ([10,000]) were detected. Any parameters beyond this limit have been ignored. To change this limit, set the maxParameterCount attribute on the Connector.
    at org.apache.tomcat.util.http.Parameters.addParameter(Parameters.java:204) ~[tomcat-embed-core-8.5.11.jar:8.5.11]
    at org.apache.catalina.connector.Request.parseParts(Request.java:2860) ~[tomcat-embed-core-8.5.11.jar:8.5.11]
    at org.apache.catalina.connector.Request.parseParameters(Request.java:3177) ~[tomcat-embed-core-8.5.11.jar:8.5.11]
    at org.apache.catalina.connector.Request.getParameter(Request.java:1110) ~[tomcat-embed-core-8.5.11.jar:8.5.11]
    at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:381) ~[tomcat-embed-core-8.5.11.jar:8.5.11]

我理解异常,但我想弄清楚application.properties我可以调整的地方。我在那里设置了spring.http.multipart.max-file-sizespring.http.multipart.max-request-size。我在source maxParameterCount找不到与@Configuration public class TomcatCustomizationConfiguration { @Bean public TomcatEmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory() { final int maxHttpRequests = 50000; TomcatEmbeddedServletContainerFactory tomcatFactory = new TomcatEmbeddedServletContainerFactory(); tomcatFactory.addConnectorCustomizers(connector -> connector.setMaxParameterCount(maxHttpRequests)); return tomcatFactory; } } 相同的内容。

此外,假设有一种方法我可以为使用spring boot(嵌入式tomcat)本地运行的实例设置它,更改是否也可以在deploymenet环境中运行,或者是否需要更改tomcat配置?

更新:我发现一个解决方案在使用spring boot本地运行时有效。我假设,因为这正在改变Tomcat嵌入式实例,这不适用于部署的完整tomcat环境 - 我想知道是否有一个可以在两个tomcat实例中使​​用的解决方案。

{ 
    "albumName": "my album",
    "photos": [photo1Id, photo2Id, photo3Id]
}

1 个答案:

答案 0 :(得分:0)

根据Spring documentation,您可以通过扩展WebServerFactoryCustomizer自行添加缺少的配置:

<块引用>

如果您的用例不存在配置键,那么您应该查看 WebServerFactoryCustomizer。您可以声明这样一个组件并访问服务器工厂和所选的网络堆栈。

由于还没有 server.tomcat.max-parameter-count 配置,您可以像 OP 配置代码一样添加它:

@Configuration
public class TomcatCustomizationConfiguration implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {
    @Value("${server.tomcat.max-parameter-count:10000}")
    private int maxParameterCount;

    @Override
    public void customize(TomcatServletWebServerFactory factory) {
        factory.addConnectorCustomizers(connector -> connector.setMaxParameterCount(maxParameterCount));
    }
}

注意我实际上在 this 博客上找到了解决方案。