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

Flux接口日志正常却返回空值的问题求助

问题原因分析

你的代码返回Flux<String>时接口返回空,核心原因是Spring WebFlux对响应式返回类型的默认处理逻辑限制:

  • 默认消息转换器的行为:Spring WebFlux中,StringHttpMessageConverter默认只处理单个完整的字符串响应体,而非流式的多个字符串片段。虽然你的Flux正常发射了两个元素(日志中的onNext事件可证明),但这些独立的字符串元素没有被框架正确组装成符合HTTP响应规范的内容,最终导致响应体为空。

  • block()的本质作用:当你改用block()并移除Flux时,是把异步的响应式流阻塞同步化,将Flux中的所有元素收集成普通Java集合(比如List<String>),此时框架会把这个集合当作普通同步返回值,用对应的消息转换器(如MappingJackson2HttpMessageConverter)序列化成JSON数组,自然能正常返回内容。

解决方法

如果想保留响应式的Flux返回并正常输出内容,有两种常见方案:

  1. 启用Server-Sent Events(SSE)流式响应
    指定接口的produces为text/event-stream,让框架以SSE协议逐个推送每个字符串元素,客户端可流式接收:
@GetMapping(value = "/test", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> test() {
  return Flux.just("Test1", "test2")
    .delayElements(Duration.ofSeconds(1))
    .log();
}
  1. 收集为Mono<List>返回JSON数组
    若希望返回完整的JSON数组而非流式响应,将Flux收集为Mono<List<String>>,让框架序列化整个列表:
@GetMapping("/test")
public Mono<List<String>> test() {
  return Flux.just("Test1", "test2")
    .delayElements(Duration.ofSeconds(1))
    .collectList()
    .log();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 17:24:56