【问题标题】:How to Convert Play 2.1 Async Method to Play 2.3 Promise如何将 Play 2.1 异步方法转换为 Play 2.3 Promise
【发布时间】:2015-03-16 01:49:37
【问题描述】:

我正在尝试将 PlayFramework 项目升级到当前版本,但在转换之前的返回签名之一时遇到了问题。

以前(Play 2.1 / Java 1.7)我们有一个控制器方法,它构建了一系列 Photo 对象作为 Promise,然后在最后将结果组合为异步响应:

// 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 表达式也可以。

【问题讨论】:

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


    【解决方案1】:

    想通了。这是修改后的代码:

    // 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&lt;Result&gt;。如果您的控制器中有任何不返回承诺的步骤,则更容易实现,如下所示:

    return Promise.promise(() -> badRequest(result));
    

    【讨论】:

      猜你喜欢
      • 2014-12-26
      • 2012-11-08
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-05
      • 2015-10-24
      • 1970-01-01
      相关资源
      最近更新 更多