Spring Boot Rest服务表格太大了 [英] Spring Boot Rest Service Form too large

查看:204
本文介绍了Spring Boot Rest服务表格太大了的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的是Spring Boot 1.3.2,我需要公开一个REST Web服务。对于这个Web服务,我需要传递一个String(包含xml数据)作为参数。字符串的大小通常在2 MB到120 MB之间。问题是我不知道如何配置REST方法参数允许的最大大小,并且默认大小太小。由于其他依赖性,Spring配置必须位于java类中。这是我的配置类:

I am using Spring Boot 1.3.2 and I need to expose a REST Web Service. To this web service I need to pass a String (that contains xml data) as parameter. The size of the string is usually between 2 MB and 120 MB. The problem is that I do not know how to configure the maximum size allowed for the REST method parameter and the default size is way too small. The Spring configuration must be in a java class, due to other dependencies. This is my configuration class:

@Configuration
@ComponentScan("eu.buzea")
@EnableAutoConfiguration
@EnableNeo4jRepositories("eu.buzea.datamodel.repositories")
@EnableTransactionManagement
@SpringBootApplication
    public class Application extends Neo4jConfiguration {

public Application() {
    System.setProperty("username", <CONFIDENTIAL>);
    System.setProperty("password", <CONFIDENTIAL>);

}

@Override
public Neo4jServer neo4jServer() {
    return new RemoteServer("http://localhost:7474");
}

@Override
public SessionFactory getSessionFactory() {
    return new SessionFactory("eu.buzea.datamodel.entities");
}

@Override
@Bean
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public Session getSession() throws Exception {
    return super.getSession();
}

public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
}
}

这就是我的网络方法的样子:

This is how my web method looks like:

@RequestMapping(method = RequestMethod.POST)
public boolean processing(@RequestParam(value = "xml", required = true) String xml) 

当我向方法发送一个字符串时,我收到以下错误:

And when I send a String to the method I receive the following error:

java.lang.IllegalStateException: Form too large: 780963 > 200000
at org.eclipse.jetty.server.Request.extractFormParameters(Request.java:365) ~[jetty-server-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.server.Request.extractContentParameters(Request.java:303) ~[jetty-server-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.server.Request.extractParameters(Request.java:257) ~[jetty-server-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.server.Request.getParameter(Request.java:826) ~[jetty-server-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:70) ~[spring-web-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) ~[jetty-servlet-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121) ~[spring-web-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) ~[jetty-servlet-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585) [jetty-servlet-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) [jetty-server-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577) [jetty-security-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223) [jetty-server-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127) [jetty-server-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515) [jetty-servlet-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) [jetty-server-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061) [jetty-server-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) [jetty-server-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) [jetty-server-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.server.Server.handle(Server.java:499) [jetty-server-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:311) [jetty-server-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257) [jetty-server-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:544) [jetty-io-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635) [jetty-util-9.2.14.v20151106.jar:9.2.14.v20151106]
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555) [jetty-util-9.2.14.v20151106.jar:9.2.14.v20151106]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_71]
2016-04-26 20:32:44 [qtp2021854618-21] WARN  org.eclipse.jetty.http.HttpParser - badMessage: java.lang.IllegalStateException: too much data after closed for HttpChannelOverHttp@4d208ff0{r=1,c=false,a=IDLE,uri=}

任何人都可以告诉我如何设置(格言请求大小)最大表单内容大小为200 MB或无限?

Can anyone tell me how to set the (maximum request size) maximum form content size to be 200 MB or infinite?

更新
以下帖子给出一个解决方案,以防你使用Jetty服务器,它没有嵌入Spring Boot: stackoverflow.com/questions / 3861455 / form-too-large-exception

我想设置 maxFormContentSize 参数,但我不确定是否它是Eclipse参数或Spring参数。

I want to set the maxFormContentSize parameter, but I am not sure if it is an Eclipse parameter or a Spring parameter.

P.S。我现在知道如何使用MultipartFile Upload解决问题。此外,还有另一种选择:在请求体中发送字符串/数据。它们都很好用,但我想知道是否可以在Spring或Eclipse中设置 maxFormContentSize

P.S. I know now how to solve the problem using MultipartFile Upload. Also, there is another option: to send the String/Data in the request Body. They both work great, but I want to know if it possible to set the maxFormContentSize in Spring or Eclipse

推荐答案

Spring Boot 1.4.0.M2有一个新属性 server.max-http-post-size ,可用于配置它。里程碑可以从 https://repo.spring.io/libs-milestone 获得。

Spring Boot 1.4.0.M2 has a new property, server.max-http-post-size, that can be used to configure this. Milestones are available from https://repo.spring.io/libs-milestone.

如果您想坚持使用Spring Boot 1.3.x,您可以通过将以下bean添加到应用程序的配置中来实现相同的逻辑:

If you want to stick with Spring Boot 1.3.x, you can implement the same logic yourself by adding the following bean to your application's configuration:

@Bean
public EmbeddedServletContainerCustomizer jettyCustomizer() {
    return new EmbeddedServletContainerCustomizer() {

        @Override
        public void customize(ConfigurableEmbeddedServletContainer container) {
            if (container instanceof JettyEmbeddedServletContainerFactory) {
                ((JettyEmbeddedServletContainerFactory) container)
                        .addServerCustomizers(new JettyServerCustomizer() {

                    @Override
                    public void customize(Server server) {
                        setHandlerMaxHttpPostSize(200 * 1024 * 1024, server.getHandlers());
                    }

                    private void setHandlerMaxHttpPostSize(int maxHttpPostSize,
                            Handler... handlers) {
                        for (Handler handler : handlers) {
                            if (handler instanceof ContextHandler) {
                                ((ContextHandler) handler)
                                        .setMaxFormContentSize(maxHttpPostSize);
                            }
                            else if (handler instanceof HandlerWrapper) {
                                setHandlerMaxHttpPostSize(maxHttpPostSize,
                                        ((HandlerWrapper) handler).getHandler());
                            }
                            else if (handler instanceof HandlerCollection) {
                                setHandlerMaxHttpPostSize(maxHttpPostSize,
                                        ((HandlerCollection) handler).getHandlers());
                            }
                        }
                    }
                });
            }
        }
    };
}

这篇关于Spring Boot Rest服务表格太大了的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆