当使用WebClient的exchangeToMono()
时,主体检索部分总是返回一个空的Mono:
例如,公开的服务返回一个非空的Mono。
@PostMapping("/test")
public Mono<Pojo> getCalled(@RequestBody Pojo pojo) {
System.out.println(pojo); // always prints a non-null object
return Mono.just(pojo);
}
WebClient与.retrieve()
WebClient.create().post().uri(theUrl).bodyValue(p).retrieve().toEntity(Pojo.class).map(response -> {
if (response.getStatusCode().isError()) {
// do something;
}
return response.getBody();
}).single(); // always get a single element and does not fail
WebClient与.exchangeToMono()
WebClient.create().post().uri(theUrl).bodyValue(p).exchangeToMono(Mono::just).flatMap(response -> {
if (response.statusCode().isError()) {
// do something;
}
return response.bodyToMono(Pojo.class).single(); // fails with java.util.NoSuchElementException: Source was empty
});
我做错了什么吗?
发布于 2021-12-21 19:05:07
我不知道你为什么要做exchangeToMono(Mono::just).flatMap(response -> ...)
,因为它没有任何意义。
不,不需要使用Mono
两次,只需阅读有关如何正确使用exchange函数的文档( WebClient > Exchange )
下面是从文档中获取的示例
Mono<Person> entityMono = client.get()
.uri("/persons/1")
.accept(MediaType.APPLICATION_JSON)
.exchangeToMono(response -> {
if (response.statusCode().equals(HttpStatus.OK)) {
return response.bodyToMono(Person.class);
}
else {
// Turn to error
return response.createException().flatMap(Mono::error);
}
});
下面是您的代码,但是在exchangeToMono
中执行这些操作
WebClient.create().post().uri(theUrl).bodyValue(p).exchangeToMono(response -> {
if (response.statusCode().isError()) {
// do something;
}
return response.bodyToMono(Pojo.class).single();
});
exchangeToMono
是有目的的,它不只是把东西放到一个Mono<T>
中--在那里--因为您需要使用response
,以便服务器能够释放已经分配的连接。您可以在exchangeToMono
中执行检查等操作,然后将身体提取为Mono<T>
。
发布于 2021-12-21 16:21:21
响应Mono
是空的,因为它已经被.exchangeToMono
使用了,因此single()
操作符在NoSuchElementException
中失败了。
https://stackoverflow.com/questions/70437514
复制相似问题