我正在用Java编写一个剧本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.
}但是问题是回调返回一个承诺,而我的方法需要返回一个JsonNode。
我如何在承诺中获得JsonNode??我找不到解决问题的办法。
在Scala中,我知道我可以在flatMap上使用FutureT。
发布于 2014-10-23 08:26:00
您的方法执行异步操作,因此不应该返回JsonNode,而应该返回Promise<JsonNode>。
从概念上讲--这是有意义的--您的方法并不是立即获取数据,而是分派一个与所述数据相关的任务,该任务将在将来完成一段时间。您可以通过打开承诺来访问响应。您可以返回Promise<JsonNode>,然后在调用方站点上调用.map来打开该值。
您还可以根据承诺调用.get(),这将迫使数据等待结果(即返回jsonPromise.get(),但这否定了使用承诺的好处)。请注意,这里的get()与holder上的get()不同,这很好,因为它只是返回承诺。
发布于 2014-10-23 08:29:33
相反,返回结果承诺:
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;
}https://stackoverflow.com/questions/26523544
复制相似问题