You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何从Mono<T>获取数据?从Mono<Period>提取startDate的正确方法

结论

你编写的这段代码完全不正确,无法正常获取到startDate的值。

错误原因

  • Mono.subscribe() 方法的返回值是 Disposable 类型,仅用于后续取消订阅操作,和你在回调函数中拿到的 startDate 没有任何关联,此处强制类型转换会直接抛出 ClassCastException。
  • 响应式流是惰性求值、异步执行的,调用subscribe后上游的数据库查询不会立刻执行完成,回调逻辑要等查询返回结果后才会触发,同步代码直接取值根本拿不到还未生成的结果。

正确实现方案

方案1:保持响应式链式调用(推荐)

如果你的业务本身运行在响应式环境中,不要强行拆包Mono获取值,直接通过操作符处理流即可:

// 从Mono<Period>映射得到Mono<Date>
Mono<Date> startDateMono = periodMono.map(Period::getStartDate);
// 在subscribe的回调中处理需要用到startDate的业务逻辑
startDateMono.subscribe(startDate -> {
    // 此处写业务逻辑,比如存储、打印、传递给其他方法等
    System.out.println("获取到的startDate为:" + startDate);
});

方案2:同步阻塞取值(仅适配非响应式场景)

如果你的业务是传统同步代码,不得不拿到具体的Date值,可以使用block()方法阻塞等待结果返回:

// 阻塞等待查询结果返回,如果查询无结果则返回null
Period period = periodMono.block();
Date startDate = period != null ? period.getStartDate() : null;

注意:禁止在响应式运行环境(比如WebFlux控制器、Reactor调度线程)中调用block()方法,会造成线程阻塞甚至死锁,这类场景请优先使用链式响应式操作处理数据。

内容的提问来源于stack exchange,提问作者aaaaaajib

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 19:36:04