【问题标题】:How to access attributes returned as a Mono object separately using Springboot如何使用 Spring Boot 分别访问作为 Mono 对象返回的属性
【发布时间】:2019-10-19 18:36:23
【问题描述】:

我借助 Spring Boot 中的反应式编程开发了一个 REST 服务。我能够将数据作为单声道对象检索。但我只需要从返回的单声道对象中捕获必要的属性

public Mono<Boolean> getUserAddress(User userRequest) {
    Mono<User> user =  userRepository.findByUsername(userRequest.getUsername());

   return user.filter(usr -> true).hasElement();
}

当有相关用户名的数据返回时,此代码返回 true。但我真正想要的是只从返回的 Mono 对象中检索“地址”属性并进行一些其他处理。

仅供参考 - Mono 对象返回在我的代码中工作正常

【问题讨论】:

  • 你试过类似 List user = userRepository.findByUsername(userRequest.getUsername());或 UserEntity user = userRepository.findByUsername(userRequest.getUsername());
  • 使用map 检索address
  • @SandOfTime 对我不起作用,因为 findByUsername 返回一个 Mono 对象

标签: java spring-boot spring-webflux reactive


【解决方案1】:

使用简单的地图。

user.map(usr -&gt; usr.getWhatYouWant())

无论如何,您的代码是错误的。过滤器不会过滤任何内容。

【讨论】:

  • 我写成 System.out.print(user.map(usr -> usr.getAddress()));但它打印为 MonoMap
  • 是的,你需要以某种方式消费它。每个 Reactor “monad”都需要被消耗才能给你一个价值。通常你会想把它发送到某个地方,但在你的情况下订阅就足够了。 user.map(usr -&gt; usr.getAddress()).subscribe(System::out::println);
  • 您应该避免这种情况,因为它会破坏 Mono 流程并使您的代码同步。如果你真的需要这样做,你可以使用.block()
  • 有效 user.map(usr -> usr.getAddress()).subscribe(System.out::println);
  • 你知道将打印出来的值赋给一个变量吗?
猜你喜欢
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
  • 2016-04-11
  • 2017-12-19
  • 2017-06-02
相关资源
最近更新 更多