【问题标题】:In a SpringBoot project with MVC REST API is returning 406 response在带有 MVC REST API 的 SpringBoot 项目中返回 406 响应
【发布时间】: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 的序列化有关。

标签: java spring-boot rest spring-mvc


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 2022-01-10
    • 1970-01-01
    相关资源
    最近更新 更多