在带有 MVC REST API 的 SpringBoot 项目中返回 406 响应

Posted

技术标签:

【中文标题】在带有 MVC REST API 的 SpringBoot 项目中返回 406 响应【英文标题】:In a SpringBoot project with MVC REST API is returning 406 response 【发布时间】:2021-12-01 12:04:03 【问题描述】:

我正在开发一个 SpringBoot 项目,该项目使用常规 MVC 机制来公开 REST API。

在一个特定的 GET API 中,我收到 406 HTTP 响应。

这是我的 Controller 方法的外观:

    @GetMapping(path = "/analysis/detail/analysisId")
    public ResponseEntity<AnalysisDetailResponse> getAnalysisDetails(
            @PathVariable @NotNull Long analysisId) throws BusinessException 
        AnalysisDetailResponse analysisDetailResponse = analysisService.getAnalysisDetailsByAnalysisId(analysisId);
//        return ResponseEntity.ok(analysisService.getAnalysisDetailsByAnalysisId(analysisId));
        return ResponseEntity.ok(analysisDetailResponse);
    

AnalysisDetailResponse 是使用 Lombok 创建的(在其他 API 的情况下可以完美运行)

@Builder
@ToString
public class AnalysisDetailResponse 

    @NotNull
    private Long id;

    @NotNull
    private AnalysisStatus state;

    private String failedSummary;

    @NotNull
    @NotEmpty
    @Valid
    private List<PostDetail> posts;

    @Builder
    @ToString
    private static class PostDetail 

        @NotNull
        private Long id;

        @NotNull
        private float score;

        @NotNull
        private String body;

        private List<String> childBodyList;
    

我已经验证了整个 Response 对象的内容,看起来很完美。但是,响应始终是 406。

我需要 JSON 格式的响应,因此,IMO 不需要明确提及响应类型。

尽管如此,我尝试将以下内容添加到 @GetMapping 注释中,但没有成功:

produces = MediaType.APPLICATION_JSON_VALUE

大部分相关帖子都建议添加 jackson-mapper-asljackson-core-asl 库。我试过了,但没有任何区别

请注意,只是这个特定的 API 会导致问题。在同一个控制器中定义的其他 API 工作正常。

请推荐....

更新: 我正在尝试使用 Postman 访问 API,并且确实尝试显式添加 Accept Header 参数。运气不好

【问题讨论】:

你如何调用端点?您的日志中有任何异常吗? 您是否在 HTTP 请求中添加了 Accept 标头? Accept: */* @JoãoDias 现在我正在尝试使用 Postman 在我的 IDE 上启用调试模式来调用。我可以看到控件一直在毫无顾虑地移动,直到 Controller Method 退出。响应对象也被正确加载。日志中没有报告异常 @athom 是的,我确实在 Postman 上尝试过。顺便说一句,邮递员会自动添加它。我确实尝试显式添加它并尝试指定 Application/json,但没有任何效果 如果您尝试更简单的方法会怎样。类似于ResponseEntity&lt;String&gt; 而不是ResponseEntity&lt;AnalysisDetailResponse&gt;。这不是您需要的,但至少我们可以了解问题是否与AnalysisDetailResponse 的序列化有关。 【参考方案1】:

最终能够通过更新 Response 对象类的定义来完成这项工作。 使用了 Lombok,我将 @Data 注释应用于 Response 类以及静态内部类。目的是将多个 Lombok 注释合并为一个 用包括@NoArgsConstructor, @AllArgsConstructor, @Getter, @Setter 在内的更详细的集合替换@Data 注释解决了这个问题。

因此,在这种情况下,这些 Lombok 注释中的一个或多个是真正的罪魁祸首: @ToString, @EqualsAndHashCode, @RequiredArgsConstructor

【讨论】:

以上是关于在带有 MVC REST API 的 SpringBoot 项目中返回 406 响应的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC 转换 Spring Rest Api

在带有 MVC REST API 的 SpringBoot 项目中返回 406 响应

在 Spring MVC rest api 中实现用户认证

混合 Spring MVC + Spring Data Rest 会导致奇怪的 MVC 响应

使用 Spring Security 保护对 Spring MVC REST API 的 jQuery 调用

从 Spring MVC 控制器自动生成 REST api 文档到 RAML