首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WebClient exchangeToMono检索空体

WebClient exchangeToMono检索空体
EN

Stack Overflow用户
提问于 2021-12-21 15:02:16
回答 2查看 2.7K关注 0票数 0

当使用WebClientexchangeToMono()时,主体检索部分总是返回一个空的Mono:

例如,公开的服务返回一个非空的Mono。

代码语言:javascript
运行
复制
@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()

代码语言:javascript
运行
复制
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()

代码语言:javascript
运行
复制
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
});

我做错了什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-21 19:05:07

我不知道你为什么要做exchangeToMono(Mono::just).flatMap(response -> ...),因为它没有任何意义。

不,不需要使用Mono两次,只需阅读有关如何正确使用exchange函数的文档( WebClient > Exchange )

下面是从文档中获取的示例

代码语言:javascript
运行
复制
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中执行这些操作

代码语言:javascript
运行
复制
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>

票数 2
EN

Stack Overflow用户

发布于 2021-12-21 16:21:21

响应Mono是空的,因为它已经被.exchangeToMono使用了,因此single()操作符在NoSuchElementException中失败了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70437514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档