增加 json 上传到播放框架的限制
increasing json limit in upload to play framework
我正在使用 play framework v2.5 (Java API)。在 post 处理程序中,我收到以下异常(这让我相信它可能与通过的 json 数据的大小有关)。我已将以下内容添加到控制器操作的顶部,但这并没有解决问题:
@BodyParser.Of(value = BodyParser.Json.class, maxLength = 1024 * 1024 * 10 * 10)
是否有其他配置(可能在 application.conf 文件中设置)或在其他地方我可以增加允许处理此 post 请求的大小限制。我正在使用 Java API。
17:01:23.603 43598 [New I/O worker #3] RequestBodyHandler ERROR - Exception caught in RequestBodyHandler
java.nio.channels.ClosedChannelException: null
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.cleanUpWriteBuffer(AbstractNioWorker.java:433) ~[netty-3.10.4.Final.jar:na]
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.writeFromUserCode(AbstractNioWorker.java:128) ~[netty-3.10.4.Final.jar:na]
at org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink.handleAcceptedSocket(NioServerSocketPipelineSink.java:99) ~[netty-3.10.4.Final.jar:na]
at org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink.eventSunk(NioServerSocketPipelineSink.java:36) ~[netty-3.10.4.Final.jar:na]
at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendDownstream(DefaultChannelPipeline.java:779) ~[netty-3.10.4.Final.jar:na]
at org.jboss.netty.channel.Channels.write(Channels.java:725) ~[netty-3.10.4.Final.jar:na]
at org.jboss.netty.handler.codec.oneone.OneToOneEncoder.doEncode(OneToOneEncoder.java:71) ~[netty-3.10.4.Final.jar:na]
at org.jboss.netty.handler.codec.oneone.OneToOneEncoder.handleDownstream(OneToOneEncoder.java:59) ~[netty-3.10.4.Final.jar:na]
at org.jboss.netty.channel.DefaultChannelPipeline.sendDownstream(DefaultChannelPipeline.java:591) ~[netty-3.10.4.Final.jar:na]
at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendDownstream(DefaultChannelPipeline.java:784) ~[netty-3.10.4.Final.jar:na]
at com.typesafe.netty.http.pipelining.HttpPipeliningHandler.handleDownstream(HttpPipeliningHandler.java:88) ~[netty-http-pipelining-1.1.4.jar:na]
at org.jboss.netty.channel.DefaultChannelPipeline.sendDownstream(DefaultChannelPipeline.java:591) ~[netty-3.10.4.Final.jar:na]
at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendDownstream(DefaultChannelPipeline.java:784) ~[netty-3.10.4.Final.jar:na]
at play.core.server.netty.NettyResultStreamer$.sendDownstream(NettyResultStreamer.scala:182) ~[play-netty-server_2.11-2.4.6.jar:2.4.6]
at play.core.server.netty.NettyResultStreamer$.play$core$server$netty$NettyResultStreamer$$nettyStreamIteratee(NettyResultStreamer.scala:140) ~[play-netty-server_2.11-2.4.6.jar:2.4.6]
at play.core.server.netty.NettyResultStreamer$$anonfun$play$core$server$netty$NettyResultStreamer$$send.streamEnum(NettyResultStreamer.scala:79) ~[play-netty-server_2.11-2.4.6.jar:2.4.6]
at play.core.server.netty.NettyResultStreamer$$anonfun$play$core$server$netty$NettyResultStreamer$$send.apply(NettyResultStreamer.scala:86) ~[play-netty-server_2.11-2.4.6.jar:2.4.6]
at play.core.server.netty.NettyResultStreamer$$anonfun$play$core$server$netty$NettyResultStreamer$$send.apply(NettyResultStreamer.scala:60) ~[play-netty-server_2.11-2.4.6.jar:2.4.6]
at scala.concurrent.Future$$anonfun$flatMap.apply(Future.scala:251) ~[scala-library-2.11.7.jar:na]
at scala.concurrent.Future$$anonfun$flatMap.apply(Future.scala:249) ~[scala-library-2.11.7.jar:na]
at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) ~[scala-library-2.11.7.jar:na]
at play.api.libs.iteratee.Execution$trampoline$.executeScheduled(Execution.scala:109) ~[play-iteratees_2.11-2.4.6.jar:2.4.6]
at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:71) ~[play-iteratees_2.11-2.4.6.jar:2.4.6]
at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:40) ~[scala-library-2.11.7.jar:na]
at scala.concurrent.impl.Promise$DefaultPromise.tryComplete(Promise.scala:248) ~[scala-library-2.11.7.jar:na]
at scala.concurrent.impl.Promise$DefaultPromise.link(Promise.scala:304) ~[scala-library-2.11.7.jar:na]
at scala.concurrent.impl.Promise$DefaultPromise.linkRootOf(Promise.scala:289) ~[scala-library-2.11.7.jar:na]
at scala.concurrent.Future$$anonfun$flatMap.apply(Future.scala:253) ~[scala-library-2.11.7.jar:na]
at scala.concurrent.Future$$anonfun$flatMap.apply(Future.scala:249) ~[scala-library-2.11.7.jar:na]
at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) ~[scala-library-2.11.7.jar:na]
at akka.dispatch.BatchingExecutor$AbstractBatch.processBatch(BatchingExecutor.scala:55) ~[akka-actor_2.11-2.3.13.jar:na]
at akka.dispatch.BatchingExecutor$BlockableBatch$$anonfun$run.apply$mcV$sp(BatchingExecutor.scala:91) ~[akka-actor_2.11-2.3.13.jar:na]
at akka.dispatch.BatchingExecutor$BlockableBatch$$anonfun$run.apply(BatchingExecutor.scala:91) ~[akka-actor_2.11-2.3.13.jar:na]
at akka.dispatch.BatchingExecutor$BlockableBatch$$anonfun$run.apply(BatchingExecutor.scala:91) ~[akka-actor_2.11-2.3.13.jar:na]
at scala.concurrent.BlockContext$.withBlockContext(BlockContext.scala:72) ~[scala-library-2.11.7.jar:na]
at akka.dispatch.BatchingExecutor$BlockableBatch.run(BatchingExecutor.scala:90) ~[akka-actor_2.11-2.3.13.jar:na]
at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:40) ~[akka-actor_2.11-2.3.13.jar:na]
at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:397) ~[akka-actor_2.11-2.3.13.jar:na]
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) ~[scala-library-2.11.7.jar:na]
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) ~[scala-library-2.11.7.jar:na]
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) ~[scala-library-2.11.7.jar:na]
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) ~[scala-library-2.11.7.jar:na]
我将使用 play.http.parser.maxMemoryBuffer
在 application.conf 中增加数据限制。当我开始工作时,我会更新 post。
可以使用 application.conf 文件中的以下字段来修改播放框架中的各种缓冲区:
parsers.text.maxLength=
play.http.parser.maxDiskBuffer=
play.http.parser.maxMemoryBuffer=
增加缓冲区大小解决了我的问题。
仅供参考,这里介绍了内置的正文解析器:
https://www.playframework.com/documentation/2.5.x/ScalaBodyParsers#max-content-length
因此您可以使用 play.http.parser.maxMemoryBuffer
或在您的操作中定义它:
def save = Action(parse.maxLength(1024 * 10, storeInUserFile)) { request =>
Ok("Saved the request content to " + request.body)
}
我正在使用 play framework v2.5 (Java API)。在 post 处理程序中,我收到以下异常(这让我相信它可能与通过的 json 数据的大小有关)。我已将以下内容添加到控制器操作的顶部,但这并没有解决问题:
@BodyParser.Of(value = BodyParser.Json.class, maxLength = 1024 * 1024 * 10 * 10)
是否有其他配置(可能在 application.conf 文件中设置)或在其他地方我可以增加允许处理此 post 请求的大小限制。我正在使用 Java API。
17:01:23.603 43598 [New I/O worker #3] RequestBodyHandler ERROR - Exception caught in RequestBodyHandler
java.nio.channels.ClosedChannelException: null
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.cleanUpWriteBuffer(AbstractNioWorker.java:433) ~[netty-3.10.4.Final.jar:na]
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.writeFromUserCode(AbstractNioWorker.java:128) ~[netty-3.10.4.Final.jar:na]
at org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink.handleAcceptedSocket(NioServerSocketPipelineSink.java:99) ~[netty-3.10.4.Final.jar:na]
at org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink.eventSunk(NioServerSocketPipelineSink.java:36) ~[netty-3.10.4.Final.jar:na]
at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendDownstream(DefaultChannelPipeline.java:779) ~[netty-3.10.4.Final.jar:na]
at org.jboss.netty.channel.Channels.write(Channels.java:725) ~[netty-3.10.4.Final.jar:na]
at org.jboss.netty.handler.codec.oneone.OneToOneEncoder.doEncode(OneToOneEncoder.java:71) ~[netty-3.10.4.Final.jar:na]
at org.jboss.netty.handler.codec.oneone.OneToOneEncoder.handleDownstream(OneToOneEncoder.java:59) ~[netty-3.10.4.Final.jar:na]
at org.jboss.netty.channel.DefaultChannelPipeline.sendDownstream(DefaultChannelPipeline.java:591) ~[netty-3.10.4.Final.jar:na]
at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendDownstream(DefaultChannelPipeline.java:784) ~[netty-3.10.4.Final.jar:na]
at com.typesafe.netty.http.pipelining.HttpPipeliningHandler.handleDownstream(HttpPipeliningHandler.java:88) ~[netty-http-pipelining-1.1.4.jar:na]
at org.jboss.netty.channel.DefaultChannelPipeline.sendDownstream(DefaultChannelPipeline.java:591) ~[netty-3.10.4.Final.jar:na]
at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendDownstream(DefaultChannelPipeline.java:784) ~[netty-3.10.4.Final.jar:na]
at play.core.server.netty.NettyResultStreamer$.sendDownstream(NettyResultStreamer.scala:182) ~[play-netty-server_2.11-2.4.6.jar:2.4.6]
at play.core.server.netty.NettyResultStreamer$.play$core$server$netty$NettyResultStreamer$$nettyStreamIteratee(NettyResultStreamer.scala:140) ~[play-netty-server_2.11-2.4.6.jar:2.4.6]
at play.core.server.netty.NettyResultStreamer$$anonfun$play$core$server$netty$NettyResultStreamer$$send.streamEnum(NettyResultStreamer.scala:79) ~[play-netty-server_2.11-2.4.6.jar:2.4.6]
at play.core.server.netty.NettyResultStreamer$$anonfun$play$core$server$netty$NettyResultStreamer$$send.apply(NettyResultStreamer.scala:86) ~[play-netty-server_2.11-2.4.6.jar:2.4.6]
at play.core.server.netty.NettyResultStreamer$$anonfun$play$core$server$netty$NettyResultStreamer$$send.apply(NettyResultStreamer.scala:60) ~[play-netty-server_2.11-2.4.6.jar:2.4.6]
at scala.concurrent.Future$$anonfun$flatMap.apply(Future.scala:251) ~[scala-library-2.11.7.jar:na]
at scala.concurrent.Future$$anonfun$flatMap.apply(Future.scala:249) ~[scala-library-2.11.7.jar:na]
at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) ~[scala-library-2.11.7.jar:na]
at play.api.libs.iteratee.Execution$trampoline$.executeScheduled(Execution.scala:109) ~[play-iteratees_2.11-2.4.6.jar:2.4.6]
at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:71) ~[play-iteratees_2.11-2.4.6.jar:2.4.6]
at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:40) ~[scala-library-2.11.7.jar:na]
at scala.concurrent.impl.Promise$DefaultPromise.tryComplete(Promise.scala:248) ~[scala-library-2.11.7.jar:na]
at scala.concurrent.impl.Promise$DefaultPromise.link(Promise.scala:304) ~[scala-library-2.11.7.jar:na]
at scala.concurrent.impl.Promise$DefaultPromise.linkRootOf(Promise.scala:289) ~[scala-library-2.11.7.jar:na]
at scala.concurrent.Future$$anonfun$flatMap.apply(Future.scala:253) ~[scala-library-2.11.7.jar:na]
at scala.concurrent.Future$$anonfun$flatMap.apply(Future.scala:249) ~[scala-library-2.11.7.jar:na]
at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) ~[scala-library-2.11.7.jar:na]
at akka.dispatch.BatchingExecutor$AbstractBatch.processBatch(BatchingExecutor.scala:55) ~[akka-actor_2.11-2.3.13.jar:na]
at akka.dispatch.BatchingExecutor$BlockableBatch$$anonfun$run.apply$mcV$sp(BatchingExecutor.scala:91) ~[akka-actor_2.11-2.3.13.jar:na]
at akka.dispatch.BatchingExecutor$BlockableBatch$$anonfun$run.apply(BatchingExecutor.scala:91) ~[akka-actor_2.11-2.3.13.jar:na]
at akka.dispatch.BatchingExecutor$BlockableBatch$$anonfun$run.apply(BatchingExecutor.scala:91) ~[akka-actor_2.11-2.3.13.jar:na]
at scala.concurrent.BlockContext$.withBlockContext(BlockContext.scala:72) ~[scala-library-2.11.7.jar:na]
at akka.dispatch.BatchingExecutor$BlockableBatch.run(BatchingExecutor.scala:90) ~[akka-actor_2.11-2.3.13.jar:na]
at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:40) ~[akka-actor_2.11-2.3.13.jar:na]
at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:397) ~[akka-actor_2.11-2.3.13.jar:na]
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) ~[scala-library-2.11.7.jar:na]
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) ~[scala-library-2.11.7.jar:na]
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) ~[scala-library-2.11.7.jar:na]
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) ~[scala-library-2.11.7.jar:na]
我将使用 play.http.parser.maxMemoryBuffer
在 application.conf 中增加数据限制。当我开始工作时,我会更新 post。
可以使用 application.conf 文件中的以下字段来修改播放框架中的各种缓冲区:
parsers.text.maxLength=
play.http.parser.maxDiskBuffer=
play.http.parser.maxMemoryBuffer=
增加缓冲区大小解决了我的问题。
仅供参考,这里介绍了内置的正文解析器:
https://www.playframework.com/documentation/2.5.x/ScalaBodyParsers#max-content-length
因此您可以使用 play.http.parser.maxMemoryBuffer
或在您的操作中定义它:
def save = Action(parse.maxLength(1024 * 10, storeInUserFile)) { request =>
Ok("Saved the request content to " + request.body)
}