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

Spring WebFlux:从Mono中提取值

宗政金鹏
2023-03-14
Mono<Account> account = webClientBuilder.build().get().uri("http://account-service/user/accounts/{userId}/",userId)
.retrieve().bodyToMono(Account.class);


//productId is a path variable on method
Mono<Product> product =this.productService.findById(productId);

block()/blockfirst()/blocklast()正在阻塞,线程反应器-http-nio-2不支持这一点

//Causes Error
Double accountBalance = account.map(a->a.getBalance()).block():

Double productPrice = product.map(p->p.getPrice()).block();

///Find difference, send response accordingly....

这是正确的方法吗?还有另一种更好的方法来实现这一点?我也在想一些类似的事情:

Mono<Double> accountBalance = account.map(a->a.getBalance()):

Mono<Double> productPrice = product.map(p->p.getPrice());

Mono<Double> res = accountBalance.zipWith(productPrice,(b,p)-> b-p);

//Something after this.....

共有1个答案

麹渊
2023-03-14

你不能在主反应器线程上使用块法。这是被禁止的。block在其他线程上发布mono时可能会起作用,但这不是一种情况。

基本上你的方法与压缩两个单声道是正确的。您可以创建一些helper方法来对它们进行计算。在您的情况下,它可能看起来像:

public boolean isAccountBalanceGreater(Account acc, Product prd) {
   return acc.getBalance() >= prd.getPrice();
}

然后,在单流中,您可以传递方法引用,使其更具可读性。

Mono<Boolean> result = account.zipWith(productPrice, this::isAccountBalanceGreater)

return account.zipWith(productPrice, this::createResponse);

...

ResponseEntity createResponse(Account acc, Product prd) {
   int responseCode = isAccountBalanceGreater(acc, prd) ? 200 : 500;
   return ResponseEntity.status(responseCode).body(prd);
}
 类似资料:
  • 我是Reactor编程新手,需要MONO/Flux方面的帮助 我有POJO课程 受雇者Java语言 我在访问服务时返回了Mono,我需要从Mono中提取名称作为字符串。 但这再次返回Mono而不是字符串。我需要从这个Mono中提取String值。

  • 我是新的Spring WebFlux。我正在编写一个简单的api,它调用另一个api,并返回响应。我遇到的问题是我的api接受不同于外部api的请求类型。我必须将传入的请求转换为外部api。我使用Mono来接收对我的api的请求,但在没有block()的情况下转换为另一个对象时遇到了麻烦。 输入 有没有一种方法可以把单声道转换成Person对象而不阻塞?

  • 请查看以下使用RestTemplate的controller代码(添加注释): 现在,我正试图通过反应式编程实现同样的目标。我现在使用WebFlux中的WebClient和Mono。但是,我很困惑如何将结果结合起来?看一看下面的代码(在任何地方都使用Mono,其余代码保持不变) 问题1:我们如何整合一切,形成一个Mono对象,并将其作为响应发送出去? 问题2:“CourseInfo CourseI

  • 我有一个包含两部分的简单程序:一个Spring5服务器,其中一个endpoint返回Mono 当我浏览到http://localhost:8080/rand返回一个双精度值。但是,当我使用客户机时,检索到的值始终为null(响应状态为200)。 我错过了什么?

  • 我有一个接受Mono作为参数的方法。我只想从中得到实际的字符串。Googled但是除了调用Mono对象上的block(),没有找到答案,但是它会进行阻塞调用,所以要避免使用block()。如果可能的话,请建议其他方法。我之所以需要这个字符串,是因为在这个方法中,我需要用实际的字符串值调用另一个方法,比如print()。我明白这很容易,但我是反应性编程的新手。 代码:

  • Q非常业余的程序员在这里,寻求你的帮助。 我必须经常编辑这样的xml文件 使用一个相当复杂的正则表达式搜索和替换过程,我只能提取标记属性的值。(这就是我所关心的)。 但是这很耗时,而且在Python中必须有非常简单的方法来查找属性标记="SOME_TEXT"部分并将所有值放入一个数组中,然后打印出该数组(到文件中)。但是我无法弄清楚:( 我正在寻找一种不包括导入任何类型的XML库的方法,因为我想让