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

为何无法查看Reactive Spring的Mono响应?求排查方案

解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 13:10:33