如何转换播放2.1异步方法播放2.3承诺

时间:2015-03-16 01:49:37

标签: java-8 akka java-7 playframework-2.1 playframework-2.3

我尝试将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表达式的使用也会很好。

1 个答案:

答案 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));