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

alb*_*ami 2 java callback promise playframework

我正在用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.
    }
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ben*_*aum 7

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

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

您还可以调用.get()将强制数据等待结果的承诺(即 - 返回jsonPromise.get()但是否定了使用promises开头的好处.请注意,get()这与get()on holder 不同,因为它只返回承诺.