当前位置: 首页 > 知识库问答 >
问题:

WebClient exchangeToMono正在检索空正文

严景焕
2023-03-14

使用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

带有. exchange eToMono()的WebClient

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
});

我做错什么了吗?

共有2个答案

陆洲
2023-03-14

响应Mono为空,因为它已经被. exchange eToMono使用,因此单()运算符在NoSuchElementException中失败。

颜志学
2023-03-14

我不知道你为什么要做exchange eToMono(Mono::只是)。

不,您不需要使用Mono两次,您需要的是阅读有关如何正确使用exchange功能WebClient的文档

以下是摘自文档的示例

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中

 类似资料:
  • 我有这个应用程序,它从数据库中获取用户数据,使用他们登录的用户名。一旦他们登录到检索他们的帐户信息的页面,用户名就会被传递。应用程序崩溃了,说检索信息是错误的,有人能帮忙吗? 数据库代码 要检索数据的代码

  • 问题内容: 我需要Java中的正则表达式,可用于从任何URL检索domain.tld部分。所以https://foo.com/bar,HTTP://www.foo.com#bar,http://bar.foo.com都会返回foo.com。 我写了这个正则表达式,但它与整个网址匹配 我不确定我是否匹配“。” 角色权利。我试过了 ”。” 但是我从netbeans收到一个错误。 更新: tld不限于2

  • 我通过在方法之外添加一个简单的Ride实例来测试它,它工作得很好。 我还尝试将监听器更改为,结果相同。 Edit2:当我试图从数据库中检索整数时,我会得到一条错误消息。

  • 我想检查对象数组中是否有具有null值的属性,如果有,则返回true。 目前我的问题是 #用于检查空属性的当前代码 #对象=这个。拟议时间表

  • 这段代码可以正常工作(我有权授予自己权限也没有问题,因为我在公用文件夹管理AD组中),但问题是我没有表示当前用户的对象。我甚至没有,这是获取的另一种方法。我只知道我处于一个对邮箱有权限的用户的上下文中--它可能是当前的Windows用户,可能只是传递给我的库的。 在EWS中是否有一种方法可以获取当前用户,或者至少当前用户的SMTP地址?我查看了类,但没有找到任何类似的内容。

  • 我正在和一个节点一起工作。js Discord机器人,但在这一点上真的卡住了。我正在尝试检索与运行该命令的人在同一语音通道中的所有成员的名称和id。然而,我很难确定从数据中提取这些数据的最后一步。以下是我所拥有的: membersofChannel向我提供数据,这些数据可以很好地传送到控制台。日志,但我需要从中提取用户名和id,并将其发布在消息中。任何帮助都将不胜感激。