如何在Play框架中组合两个单独的WS调用的结果?

时间:2014-09-25 14:38:29

标签: java playframework-2.0

我有一个控制器方法,它同时发送两个Web服务请求,我立即返回它们的承诺。现在我想要做的是将两个Web服务调用的结果合并到返回给用户的单个结果中。我到目前为止的代码是:

 public static Promise<Result> search(String searchTerms) {
    final Promise<List<SearchResult>> result1 = webserviceOne(searchTerms);
    final Promise<List<SearchResult>> result2 = webserviceTwo(searchTerms);

    return result1.flatMap(
            new Function<Promise<List<SearchResult>>, Promise<Result>>() {
                public Promise<Result> apply(Promise<List<SearchResult>> res1) {
                    return result2.flatMap(
                        new Function<Promise<List<SearchResult>>, Result>() {
                            public Result apply(Promise<List<SearchResult>> res2) {
                                //TODO: Here I want to combine the two lists of results and return a JSON response
                            }
                        }
                    );
                }
            }
    );
}

我该怎么做?我发现很难为这类事情找到合适的文档。

2 个答案:

答案 0 :(得分:0)

这样的事情应该这样做:

 public static Promise<Result> search(String searchTerms) {
    final Promise<List<SearchResult>> result1 = webserviceOne(searchTerms);
    final Promise<List<SearchResult>> result2 = webserviceTwo(searchTerms);

    return result1.flatMap(
            new Function<Promise<List<SearchResult>>, Promise<Result>>() {
                public Promise<Result> apply(List<SearchResult> res1) {
                    return result2.flatMap(
                        new Function<Promise<List<SearchResult>>, Result>() {
                            public Result apply(List<SearchResult> res2) {
                                List<SearchResult> newList = new ArrayList<SearchResult>(res1);
                                newList.addAll(res2);
                                return ok(toJson(newList));
                            }
                        }
                    );
                }
            }
    );
}

答案 1 :(得分:0)

@Override
public Zone buildZone(final GeoPoint center, final int distance) {
    Promise<List<Street>> streetPromise = Promise.promise(
            new Function0<List<Street>>() {
                public List<Street> apply() {
                    return streetRepository.findByLocation(center.getGeom(), distance);
                }
            }
    );

    Promise<List<Place>> placePromise = Promise.promise(
            new Function0<List<Place>>() {
                public List<Place> apply() {
                    return placeService.findByLocation(center, distance);
                }
            }
    );

    Promise<Zone> result = Promise.sequence(streetPromise, placePromise).map(
            new Function<List<List<? extends Object>>, Zone>() {
                @Override
                public Zone apply(List<List<? extends Object>> lists) throws Throwable {
                    return new Zone((List<Street>) lists.get(0), (List<Place>) lists.get(1));
                }
            }
    );

    return result.get(10, TimeUnit.SECONDS);
}