我是spring web flux的新手。
我有一个不支持批处理调用的上游服务,因此我必须为数组中的每个对象多次调用它。我还需要请求参数的实例,因为服务不会在其响应中返回这些属性。
例如,这是我将发送给客户端的响应
class Person {
int id;
String name;
int phoneNo;
}
,我只有一个id列表
List<Integer> lstIds
对于每个人的api响应也是
{
"name": "name",
"phoneNo": 2222222222
}
请注意,响应中没有id字段,因此,我需要请求参数来映射请求与响应。
我有一个名为createRequestFromIdWillReturnMono(int id)
的方法,它接受整数id并返回web客户端Mono作为响应。
我已经尽力了
List<Person> response = new ArrayList<Person>();
List<Integer> lstInt = IntStream.rangeClosed(0, 10).boxed().collect(Collectors.toList());
Flux
.fromIterable(lstInt)
.flatMap(i -> createRequestFromIdWillReturnMono(i)
.map(personResponse -> response.add(new Person(i, personResponse))));
return response;
但是这段代码只运行响应。添加调用一次,即使它调用createRequestFromIdWillReturnMono 10次。
我该如何解决这个问题?
您不需要列表,您可以使用collectList
并返回一个列表。或者您将Flux<Person>
返回给客户端,这是一个流。
Mono<List<Persons>> personsMono = Flux.fromIterable(lstInt)
.flatMap(i -> createRequestFromIdWillReturnMono(i))
.map(personResponse -> new Person(i,personResponse))
.collectList();
就像这样,我现在不在电脑上,所以不能保证它能编译,但是你应该明白。