5

我正在使用使用 Jetty 9.0.2 的 SparkJava 2.2。

我收到 Jetty 抛出的“Form too large”异常。如果我直接使用 Jetty,我已经知道如何解决这个问题:

表格太大异常

http://www.eclipse.org/jetty/documentation/current/setting-form-size.html

问题 :

现在我需要找到一种org.eclipse.jetty.server.Request.maxFormContentSize通过 SparkJava 更改设置的方法。有没有办法做到这一点?

我必须注意,由于某种原因,其他方法(JVM_OPTS、System.setProperty)对我不起作用。我仍然遇到同样的异常。

堆栈跟踪:

[qtp1858644635-27] ERROR spark.webserver.MatcherFilter -
java.lang.IllegalStateException: Form too large 308913>200000
    at org.eclipse.jetty.server.Request.extractParameters(Request.java:334)
    at org.eclipse.jetty.server.Request.getParameterMap(Request.java:765)
    at javax.servlet.ServletRequestWrapper.getParameterMap(ServletRequestWrapper.java:193)
    at spark.QueryParamsMap.<init>(QueryParamsMap.java:59)
    at spark.Request.initQueryMap(Request.java:364)
    at spark.Request.queryMap(Request.java:349)
    at spark.webserver.RequestWrapper.queryMap(RequestWrapper.java:213)
    at com.xyz.analytics.webservice.RequestTools.getRequestQueryMap(RequestTools.java:27)
    at com.xyz.analytics.webservice.RequestTools.getMandrillQueryParams(RequestTools.java:22)
    at com.xyz.analytics.webservice.Endpoints.lambda$initiateEndpointsAndExceptionHandlers$2(Endpoints.java:61)
    at com.xyz.analytics.webservice.Endpoints$$Lambda$3/1485697819.handle(Unknown Source)
    at spark.SparkBase$1.handle(SparkBase.java:311)
    at spark.webserver.MatcherFilter.doFilter(MatcherFilter.java:159)
    at spark.webserver.JettyHandler.doHandle(JettyHandler.java:60)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:179)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:136)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
    at org.eclipse.jetty.server.Server.handle(Server.java:451)
    at org.eclipse.jetty.server.HttpChannel.run(HttpChannel.java:252)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:266)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.run(AbstractConnection.java:240)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:596)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:527)
    at java.lang.Thread.run(Thread.java:745)

编辑:

我必须注意,其他方法(JVM_OPTS、System.setProperty)对我不起作用。

好吧,调试器甚至不会在设置的任何断点处org.eclipse.jetty.server.handlerContextHandler停止......另外,当它在org.eclipse.jetty.server.Request断点处停止时,_context 属性为空。似乎 SparkJava 处理它的方式不同。死路。

Request 在设置之前再做一件事maxFormContentSize = 200000;。它检查 _channel.getServer().getAttribute("org.eclipse.jetty.server.Request.maxFormContentSize")。除了服务器的属性集合是空的......而且我看不到任何添加任何属性的方法。Jetty Server 由调用 SparkServer.ignite() 的 SparkBase.init() 创建。但这对我们帮助不大。想要“闯入”我们自己的调整并不容易。似乎很绝望。

4

3 回答 3

4

Spark 2.2 不可能

ServerConnector的创建是硬编码在 SparkServer 中的,事实上您无法更改这些值,它们必须在服务器启动之前传递给 ServerConnector。

建议使用 Spark 提交错误以使其可配置。

https://github.com/perwendel/spark/issues

于 2015-08-03T21:49:30.380 回答
3

大家好消息 :) 在 Spark 2.6(2017 年 4 月发布)中,嵌入式 Jetty 是完全可配置的!发行说明:http ://sparkjava.com/news#spark-26-released

在此处查看原始的未来请求以获取更多详细信息:https ://github.com/perwendel/spark/issues/314 和相关的拉取请求: https ://github.com/perwendel/spark/pull/813

请注意,也可以在另一个 Web 服务器而不是嵌入式 Jetty 服务器上运行 Spark:http: //sparkjava.com/documentation#other-web-server

于 2017-07-13T20:18:14.010 回答
0

好吧,可以访问服务器对象,您可以随时执行以下操作:

server.setAttribute("org.eclipse.jetty.server.Request.maxFormContentSize", 1024 * 1024);

希望这可以帮助!

于 2017-06-18T01:52:43.893 回答