为何无法查看Reactive Spring的Mono响应?求排查方案
你遇到的问题核心是自定义响应对象的JSON序列化异常——因为返回字符串Flux能正常响应,说明Reactive框架本身运行正常,问题出在自定义对象无法被Spring WebFlux默认的Jackson序列化器处理,导致请求没有返回内容(通常是序列化失败后默默抛出异常,未输出响应)。
以下是具体排查和解决步骤:
1. 检查自定义类的序列化兼容性
Jackson序列化默认要求类满足两个条件:
- 存在无参构造方法
- 需要序列化的字段有对应的getter方法
针对你的MessageResponse、InstructionListResponse、InstructionListType这几个类,逐一确认:
- 如果使用Lombok,直接给类添加
@Data注解(自动生成无参构造、getter、setter),或者显式添加@NoArgsConstructor+@Getter:
@Data public class MessageResponse<T> { private boolean success; private T data; } @Data public class InstructionListResponse { private List<InstructionListType> instructionList; } @Data public class InstructionListType { private String title; }
- 如果手动编写类,必须显式定义无参构造和getter:
public class InstructionListType { private String title; // 必须存在无参构造 public InstructionListType() {} // 必须有getter方法 public String getTitle() { return title; } }
2. 验证Builder创建的对象是否有效
检查MsgResponseBuilder.build()方法,确保它确实返回了一个完整初始化的MessageResponse实例,没有出现null值或未赋值的关键字段(比如success或data为null)。可以临时加日志或debug断点确认:
@PostMapping("/test") public Mono<MessageResponse<InstructionListResponse>> test() { MessageResponse<InstructionListResponse> response = MsgResponseBuilder.build(true, InstructionListResponse.builder() .instructionList(List.of(InstructionListType.builder().title("example").build())) .build() ); // 打印对象,确认结构正确 System.out.println(response); return Mono.just(response); }
3. 查看日志定位异常
开启Spring Boot的debug日志,查看是否有序列化相关的异常输出:
在application.properties中添加配置:
logging.level.org.springframework.web=DEBUG logging.level.com.fasterxml.jackson=DEBUG
如果存在序列化失败,日志会明确指出是哪个类、哪个字段不符合要求(比如缺少构造方法、没有getter)。
4. 确认请求响应类型匹配
在Postman中,确保请求的Accept请求头设置为application/json,Spring WebFlux会根据这个头选择对应的消息转换器,避免因响应类型不匹配导致的序列化跳过。
5. 排除Mono包装的干扰
临时修改代码,直接返回自定义对象(不使用Mono包装),验证对象本身是否能正常序列化:
@PostMapping("/test") public MessageResponse<InstructionListResponse> test() { return MsgResponseBuilder.build(true, InstructionListResponse.builder() .instructionList(List.of(InstructionListType.builder().title("example").build())) .build() ); }
如果直接返回能正常响应,再换回Mono包装即可——Reactive框架对单个对象的Mono包装不会有额外问题。
内容的提问来源于stack exchange,提问作者Muhammed Caylak

