我尝试将PlayFramework项目升级到当前版本,但我无法转换之前的其中一个回复签名。
以前(Play 2.1 / Java 1.7)我们有一个控制器方法,它将一系列Photo对象构建为promises,然后在最后组合结果以获得异步响应:
// Combine all promises into a single promise
Promise<List<Photo>> promises = Promise.sequence(eachPromisedPhoto.toArray(new Promise[0]));
// Return
return async(
promises.map(
new Function<List<Photo>, Result>() {
public Result apply(List<Photo> photos) {
List<String> MD5s = new ArrayList<String>();
for (Photo photo : photos) {
if (photo != null && photo.isValid()) {
MD5s.add(photo.toString());
}
}
ObjectNode resultFinal = Json.newObject();
if (MD5s.size() > 0) {
resultFinal.put("MD5s", Json.toJson(MD5s));
resultFinal.put("status", "OK");
}
else {
resultFinal.put("status", "KO");
}
return ok(resultFinal);
}
}
)
);
据我所知,Play 2.3+中不再提供异步方法,并且不清楚如何将此返回签名正确转换为新方法。我们也在更新到Java 1.8,因此lambda表达式的使用也会很好。
答案 0 :(得分:0)
想出来。这是修改过的代码:
// Combine all promises into a single promise
Promise<List<Photo>> promises = Promise.sequence(eachPromisedPhoto);
// Return
return promises.map(
new Function<List<Photo>, Result>() {
public Result apply(List<Photo> photos) {
List<String> MD5s = new ArrayList<>();
photos.stream().filter(photo -> photo != null && photo.isValid()).forEach(photo -> {
MD5s.add(photo.toString());
});
ObjectNode resultFinal = Json.newObject();
if (MD5s.size() > 0) {
resultFinal.put("pathSums", Json.toJson(MD5s));
resultFinal.put("status", "OK");
}
else {
resultFinal.put("status", "KO");
resultFinal.put("message", "No results returned");
}
return ok(resultFinal);
}
}
);
另一个关键位是先前的返回签名是控制器方法的基本Result
,而且必须更新为Promise<Result>
。如果您的控制器中有任何不会返回承诺的步骤,那么制作一个承诺会更容易,例如:
return Promise.promise(() -> badRequest(result));