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

Spring Boot POST接口返回200但无JSON内容排查求助

Spring接口返回200但无JSON内容,断点可见POJO有数据的排查方案

问题场景

Spring服务接口返回状态码200,但响应体无任何JSON内容。已执行mvn clean install,调试断点及控制台打印均显示返回的MyServiceResponse对象包含有效数据,但接口返回空体。

相关代码

Controller代码

@Override
public MyServiceResponse getDesiredData(MyRequest myRequest)
        throws IOException {
    var resp = new MyServiceResponse();
    var req = new ServiceRequest<MyRequest>();

    req.setPayload(myRequest);

    // 该方法通过引用传递更新resp对象
    myRequestProcessor.process(req, resp);

    return resp; // 断点处可见resp包含有效数据
}

POJO代码

@SuperBuilder
@Data
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class MyServiceResponse {
    SessionInfo sessionInfo;
}

@SuperBuilder
@Data
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class SessionInfo {
    Parameters parameters;
}

@SuperBuilder
@Data
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class Parameters {
    @JsonProperty("zip")
    String zip;

    @JsonProperty("city")
    String city;

    @JsonProperty("state")
    String state;

    @JsonProperty("storeNum")
    Integer storeNum;

    @JsonProperty("startHrs")
    String startHrs;

    @JsonProperty("endHrs")
    String endHrs;
}

可能原因及解决办法

1. Lombok注解未生效,导致未生成Getter方法

Jackson默认依赖Getter方法或public字段来序列化对象。如果@Data注解未生效,MyServiceResponse和SessionInfo的字段没有对应的Getter方法,Jackson无法读取字段值进行序列化。

  • 排查点:
    • 确认项目中已引入Lombok依赖,版本与Spring Boot版本兼容(比如Spring Boot 2.x对应Lombok 1.18+)
    • IDE已安装Lombok插件,并开启了**注解处理(Annotation Processing)**功能
    • 编译后查看MyServiceResponse的class文件,确认是否生成了getSessionInfo()等Getter方法
  • 解决办法:
    补全Lombok依赖及IDE配置,确保注解生效;若暂时无法解决,可手动添加Getter方法测试。

2. 顶层嵌套字段未添加@JsonProperty注解

Jackson在序列化时,若未指定@JsonProperty,对于包私有字段(你的sessionInfo、parameters均为默认包访问权限),可能因反射权限问题无法读取,即使有Getter方法。

  • 解决办法:
    给顶层嵌套字段添加@JsonProperty注解,明确序列化字段名:
    @SuperBuilder
    @Data
    @NoArgsConstructor
    @JsonIgnoreProperties(ignoreUnknown = true)
    public class MyServiceResponse {
        @JsonProperty("sessionInfo")
        SessionInfo sessionInfo;
    }
    
    @SuperBuilder
    @Data
    @NoArgsConstructor
    @JsonIgnoreProperties(ignoreUnknown = true)
    public class SessionInfo {
        @JsonProperty("parameters")
        Parameters parameters;
    }
    

3. Jackson序列化配置被修改

若项目中自定义了ObjectMapper,可能设置了严格的序列化规则,比如仅序列化带@JsonProperty注解的字段,或关闭了字段的自动检测。

  • 排查点:
    检查项目中的配置类,是否存在类似如下的自定义ObjectMapper配置:
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        // 仅允许通过Getter方法访问字段
        mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.NONE);
        mapper.setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.PUBLIC_ONLY);
        return mapper;
    }
    
  • 解决办法:
    调整配置,确保Jackson能读取到需要序列化的字段,比如开启字段自动检测:
    mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
    

4. 消息转换器被替换

若项目引入了Gson、Fastjson等其他JSON序列化库,并替换了Spring默认的Jackson消息转换器,这些库的序列化规则与Jackson不同(比如要求字段为public),可能导致序列化失败。

  • 排查点:
    检查配置类中是否存在自定义HttpMessageConverters的代码,比如:
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new GsonHttpMessageConverter());
        // 移除Jackson转换器
        converters.removeIf(converter -> converter instanceof MappingJackson2HttpMessageConverter);
    }
    
  • 解决办法:
    若使用其他序列化库,需调整POJO的字段权限或添加对应库的序列化注解;或恢复Jackson为默认消息转换器。

验证步骤

  1. 先给MyServiceResponse和SessionInfo的嵌套字段添加@JsonProperty注解,测试接口是否返回JSON。
  2. 检查Lombok是否生效,手动添加Getter方法测试序列化效果。
  3. 开启Spring DEBUG日志,查看Jackson序列化相关日志,是否有字段被跳过的警告信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 03:24:52