前一段时间,我问how to get the body from a Result in Play 2.5.0 Java.
答案基本上是使用play.core.j.JavaResultExtractor
。我现在升级到2.6,JavaResultExtractor
不再存在(或者至少不公开)。
如何在Play 2.6中执行此操作?
我确实找到Result.body().consumeData
似乎可能有用,但也附带了令人担忧的警告:
应谨慎使用此方法,因为如果源表示短暂流,则在调用此方法后实体可能无法使用。
我想,由于我在一个动作中这样做,我可以调用consumeData将所有数据放入一个局部变量,然后处理它然后用存储的数据返回一个新结果。只有在数据太大而无法容纳到内存的情况下才会失败,这不是我目前所期待的。
答案 0 :(得分:2)
在Play 2.6中,仍然可以重新实现2.5功能。请查看从Result获取Json正文的示例:
public static JsonNode resultToJsonNode(final Result result, final long timeout, final Materializer mat)
throws Exception {
FiniteDuration finiteDuration = Duration.create(timeout, TimeUnit.MILLISECONDS);
byte[] body = Await.result(
FutureConverters.toScala(result.body().consumeData(mat)), finiteDuration).toArray();
ObjectMapper om = new ObjectMapper();
final ObjectReader reader = om.reader();
return reader.readTree(new ByteArrayInputStream(body));
}