【问题标题】:Obtain the JsonNode from a Promise[JsonNode] in Java and return that value从 Java 中的 Promise[JsonNode] 获取 JsonNode 并返回该值
【发布时间】:2014-12-18 20:28:02
【问题描述】:

我正在用 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。

【问题讨论】:

    标签: java playframework callback promise


    【解决方案1】:

    您的方法执行异步操作,因此不应返回JsonNode,而应返回Promise&lt;JsonNode&gt;

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

    您也可以在 promise 上调用 .get(),这将强制数据等待结果(即 - 返回 jsonPromise.get() 但这否定了使用 promise 开始的好处。注意 get() 这里是与持有人的get() 不同,这很好,因为它只是返回承诺。

    【讨论】:

    • 我会加强本杰明在这里所说的话。如果可以的话,尽量让你的方法返回一个Promise&lt;JsonNode&gt;,但是改变你的调用者来处理Promise。不要不要使用get()。使用所有非阻塞 Promise 方法(mapflatmap 等)以非阻塞方式访问您的数据。如果这是一个 Play 应用程序,那么您应该能够以非阻塞方式编写所有代码,因为该框架允许您的控制器返回 Promise&lt;Result&gt;
    【解决方案2】:

    返回结果的承诺:

    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;
    }
    

    【讨论】:

    • 它不是控制器方法,我可以返回一个 Promise,但是 Promise 不适合我使用。
    • 对不起,我以为是控制器方法,因为它是静态的。
    • 我看不出这与我 4 年前的回答有何不同 - 只是解释较少并使用 Java 8 语法。
    • 会员2年6个月没看到。
    • @MonCalamari 这是一个诚实的问题——我没有对你投反对票。我真的想知道你认为我的答案中缺少什么,你决定添加你的答案。我要求批评。我不明白“2 年会员资格”是如何解释的。
    猜你喜欢
    • 2019-01-26
    • 2022-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-24
    • 1970-01-01
    • 1970-01-01
    • 2023-02-25
    相关资源
    最近更新 更多