从Java中的Promise [JsonNode]获取JsonNode并返回该值

时间:2014-10-23 07:55:51

标签: java playframework callback promise

我正在用Java编写Play 2.3.2应用程序。

在我的应用程序中,我调用了另一个模块的方法,用Scala编写。

此方法返回Json响应,我尝试使用WS获取它。

这是我的方法实现:

public static JsonNode getCorrelationData() {
        WSRequestHolder holder = WS.url(ConfigFactory.load().getString("host") + "/recommendation/correlation");
        Promise<JsonNode> jsonPromise = holder.get().map(
                new Function<WSResponse, JsonNode>() {
                    public JsonNode apply(WSResponse response) {
                        if (response.getStatus() != 200) {
                            Logger.error("Error on get correlation data");
                            Logger.error("Response status code: " + response.getStatus());
                            Logger.error("Response status text: " + response.getStatusText());
                        }

                        return response.asJson();
                    }
                });



        //here I want to obtain the JsonNode inside the jsonPromise object, and return it.
    }

但问题是回调返回一个Promise,我的方法需要返回一个JsonNode。

如何在Promise中获取JsonNode?我无法找到解决问题的方法。

在Scala我知道我可以在Future [T]上使用flatMap。

2 个答案:

答案 0 :(得分:7)

您的方法执行异步操作,因此不应返回JsonNode,而应返回Promise<JsonNode>

从概念上讲 - 这是有道理的 - 您的方法不会立即获取数据 - 而是调度与将在未来某个时间完成的所述数据相关的任务。您可以通过展开承诺来访问响应。您可以返回Promise<JsonNode>,然后在来电者网站上调用.map来解包该值。

您还可以在承诺上调用.get(),这会强制数据等待结果(即返回jsonPromise.get()但是否定了使用promises开头的好处。注意{ {1}}这里与持有人的get()不同,因为它只是返回承诺。

答案 1 :(得分:1)

返回结果的承诺:

public static Promise<Result> getPromise() {
    WSRequestHolder url = WS.url("url");
    Promise<Result> promise = url.get().map((r) -> {
        if (r.getStatus() == 200) {
            return ok(r.asJson());
        } else {
            return badRequest("Bad request");
        }
    });
    return promise;
}