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

Java 如何在Play framework中组合两个单独WS调用的结果?,java,playframework-2.0,Java,Playframework 2.0,我有一个控制器方法,它同时发送两个web服务请求,我立即为这两个请求返回一个承诺。现在我要做的是将两个web服务调用的结果合并成一个返回给用户的结果。到目前为止,我掌握的代码是: public static Promise<Result> search(String searchTerms) { final Promise<List<SearchResult>> result1 = webserviceOne(searchTerms); fi

我有一个控制器方法,它同时发送两个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
                            }
                        }
                    );
                }
            }
    );
}
公共静态承诺搜索(字符串搜索术语){
最终承诺结果1=webserviceOne(搜索条款);
最终承诺结果2=WebServiceWO(搜索条款);
返回结果1.flatMap(
新函数(){
公共承诺适用(承诺res1){
返回result2.flatMap(
新函数(){
公开结果适用(承诺res2){
//TODO:在这里,我想合并两个结果列表并返回一个JSON响应
}
}
);
}
}
);
}

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

像这样的东西应该可以:

 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=webserviceOne(搜索条款);
最终承诺结果2=WebServiceWO(搜索条款);
返回结果1.flatMap(
新函数(){
公共承诺适用(列表res1){
返回result2.flatMap(
新函数(){
公开结果应用(列表2){
List newList=newarraylist(res1);
newList.addAll(res2);
返回ok(toJson(newList));
}
}
);
}
}
);
}
@覆盖
公共区域建筑区域(最终地质点中心、最终整数距离){
诺言街诺言(
新函数0(){
公共列表应用(){
return streetRepository.findByLocation(center.getGeom(),distance);
}
}
);
允诺地点允诺(
新函数0(){
公共列表应用(){
返回placeService.findByLocation(中心,距离);
}
}
);
Promise result=Promise.sequence(streetPromise,placePromise).map(
新功能
@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);
}