2016-04-26 3 views
2

Я использую Spring Boot 1.3.2, и мне нужно открыть веб-службу REST. Для этой веб-службы мне нужно передать строку (содержащую данные xml) в качестве параметра. Размер строки обычно составляет от 2 до 120 МБ. Проблема в том, что я не знаю, как настроить максимальный размер, разрешенный для параметра метода REST, а размер по умолчанию слишком мал. Конфигурация Spring должна быть в классе java из-за других зависимостей. Это мой класс конфигурации:Spring Service Service Service Form слишком большой

@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); 
} 
} 

Это как мой веб-метод выглядит следующим образом:

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

И когда я посылаю строку методу я получаю следующее сообщение об ошибке:

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 [email protected]{r=1,c=false,a=IDLE,uri=} 

Может ли кто-нибудь сказать мне, как установить ( максимальный размер запроса ) максимальный размер содержимого формы, чтобы быть 200 МБ или бесконечным?

UPDATE Следующий пост дает решение в случае, если вы используете сервер причала, который не встроен в Spring Boot: stackoverflow.com/questions/3861455/form-too-large-exception

Я хочу, чтобы установить параметр maxFormContentSize, но я не являюсь конечно, если это параметр Eclipse или параметр Spring.

P.S. Теперь я знаю, как решить проблему, используя MultipartFile Upload. Кроме того, есть еще один вариант: отправить строку/данные в тело запроса. Они оба отлично работают, но я хочу знать, можно ли установить maxFormContentSize в Spring или Eclipse

ответ

2

Spring Загрузочный 1.4.0.M2 имеет новое свойство, server.max-http-post-size, которые могут быть использованы для настройки этого. Вехи доступны от https://repo.spring.io/libs-milestone.

Если вы хотите придерживаться Spring загрузки 1.3.x, вы можете реализовать ту же самую логику самостоятельно, добавив следующий компонент в конфигурацию приложения:

@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()); 
          } 
         } 
        } 
       }); 
      } 
     } 
    }; 
} 
+0

Это ответ, который я искал! Как совет для людей, которые читают это позже: глупо идея отправить этот объем данных в параметры запроса! Лучше использовать тело запроса. –

0

Вы пытались увеличить свой HTTP POST maxPostSize?

В файле application.properties добавить:

multipart.maxFileSize=20MB

Документация:

http://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/autoconfigure/web/MultipartProperties.html

Если вы хотите в коде здесь есть документация:

Increase HTTP Post maxPostSize in Spring Boot

+0

Добавление приложения.файл свойств с этим свойством ничего не повлиял на мое приложение. Второй вариант, который вы предложили, для сервера tomacat ... –

1

Когда вы имеете дело с большими файлами, вы должны использовать multipart-file-upload. Spring 3.0 MultipartFile upload

И клиент должен послать данные к вам в многочастном формате https://stackoverflow.com/a/27097798/5649869

+0

Я просмотрел загрузку MultipartFile и может удовлетворить мои потребности. Однако создание java-клиента для отправки данных не так прямолинейно. Сообщение, которое вы предложили, не дает мне всю необходимую мне информацию. 'map.add (« файл », новый ClassPathResource (файл));' и 'template.get()' слишком расплывчаты. –