SpringBoot MVC项目REST GET接口返回406响应码排查求助
SpringBoot GET接口固定返回406排查方案
- 核心问题大概率出在返回类的序列化配置上,你当前的
AnalysisDetailResponse和内部类PostDetail仅添加了@Builder、@ToString注解,没有生成Jackson序列化所需的Getter方法,也没有开放内部类的访问权限,导致Jackson无法识别可序列化的字段,序列化失败后SpringMVC会返回406状态码,和请求头、produces配置无关。
具体排查和解决步骤
- 给返回类和内部类添加Getter注解
Lombok的@Builder不会自动生成Getter方法,Jackson序列化需要通过Getter读取类字段值,没有对应Getter的类会被Jackson判定为无有效可序列化字段,无法生成JSON响应。给两个类都添加@Getter注解即可解决,修改后的代码如下:
@Builder @ToString @Getter // 新增注解 public class AnalysisDetailResponse { @NotNull private Long id; @NotNull private AnalysisStatus state; private String failedSummary; @NotNull @NotEmpty @Valid private List<PostDetail> posts; @Builder @ToString @Getter // 新增注解 public static class PostDetail { // 把private访问权限改为public,允许Jackson访问 @NotNull private Long id; @NotNull private float score; @NotNull private String body; private List<String> childBodyList; } }
- 验证枚举类序列化逻辑
如果添加Getter后仍有问题,排查AnalysisStatus枚举类是否有自定义序列化规则、是否存在未处理的枚举值,可以临时将state字段类型改为String测试接口是否可以正常返回。 - 排查自定义MessageConverter配置
检查项目中是否存在自定义的HttpMessageConverter配置,是否对特定返回类型做了拦截处理,覆盖了默认的Jackson JSON序列化逻辑。 - 快速验证序列化问题
临时修改接口返回值为ResponseEntity.ok(Collections.singletonMap("test","value")),如果可以正常返回JSON,即可100%确认是原返回类的序列化配置问题。
内容的提问来源于stack exchange,提问作者Curious Coder
相关产品推荐
相关产品推荐

