Spring WebFlux接口返回Mono为什么响应体是实际值而非Mono对象?
问题原因解答
核心差异本质
两个行为的差异核心是是否对Mono这个发布者触发了订阅操作,你提到的「发布者在订阅前不会生产数据」的认知是完全正确的。
逐行行为解释
1. 第4行输出MonoJust的原因
System.out.print(data)直接打印的是Mono<String>类型的对象本身,此时没有对这个Mono触发订阅,所以不会触发数据生产逻辑,print方法默认调用对象的toString()实现,输出的是Mono的具体实现类MonoJust的类名标识。
2. HTTP响应返回test的原因
Spring WebFlux框架的ServerResponse.ok.body(data, String.class)方法,在接收Publisher类型的参数时,会自动在内部完成对这个Publisher的订阅操作:
- 订阅触发后,
Mono.just("test")才会发射内部封装的字符串数据test - 框架会将订阅后拿到的实际数据序列化,写入HTTP响应体返回给客户端
所以客户端最终收到的是实际的业务值,而非Mono对象本身。
附相关代码
class Test{ public Mono<ServerResponse> test(ServerRequest req){ Mono<String> data = Mono.just("test"); System.out.print(data); return ServerResponse.ok.body(data, String.class); } }
内容的提问来源于stack exchange,提问作者Jingon Park
相关产品推荐
相关产品推荐

