2

前段时间,我问如何在 Play 2.5.0 Java 中从 Result 中获取 body。

答案基本上是使用play.core.j.JavaResultExtractor. 我现在正在升级到 2.6,并且JavaResultExtractor不再存在(或者至少不公开)。

在 Play 2.6 中如何做到这一点?

我确实发现Result.body().consumeData这似乎可行,但也带有令人担忧的警告:

应谨慎使用此方法,因为如果源表示临时流,则在调用此方法后实体可能无法使用。

我想,由于我在一个动作中执行此操作,我可以调用 consumeData 将所有数据放入一个局部变量中,对其进行处理,然后使用存储的数据返回一个新结果。只有在数据太大而无法放入内存的情况下才会失败,这不是我目前所期望的。

4

1 回答 1

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));
}
于 2018-03-14T07:43:48.373 回答