Java 如何在Play framework中组合两个单独WS调用的结果?
我有一个控制器方法,它同时发送两个web服务请求,我立即为这两个请求返回一个承诺。现在我要做的是将两个web服务调用的结果合并成一个返回给用户的结果。到目前为止,我掌握的代码是: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
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);
}