我正在用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。
答案 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;
}