在带有 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-asl
和 jackson-core-asl
库。我试过了,但没有任何区别
请注意,只是这个特定的 API 会导致问题。在同一个控制器中定义的其他 API 工作正常。
请推荐....
更新: 我正在尝试使用 Postman 访问 API,并且确实尝试显式添加 Accept Header 参数。运气不好
【问题讨论】:
你如何调用端点?您的日志中有任何异常吗? 您是否在 HTTP 请求中添加了Accept
标头? Accept: */*
@JoãoDias 现在我正在尝试使用 Postman 在我的 IDE 上启用调试模式来调用。我可以看到控件一直在毫无顾虑地移动,直到 Controller Method 退出。响应对象也被正确加载。日志中没有报告异常
@athom 是的,我确实在 Postman 上尝试过。顺便说一句,邮递员会自动添加它。我确实尝试显式添加它并尝试指定 Application/json,但没有任何效果
如果您尝试更简单的方法会怎样。类似于ResponseEntity<String>
而不是ResponseEntity<AnalysisDetailResponse>
。这不是您需要的,但至少我们可以了解问题是否与AnalysisDetailResponse
的序列化有关。
【参考方案1】:
最终能够通过更新 Response 对象类的定义来完成这项工作。
使用了 Lombok,我将 @Data
注释应用于 Response 类以及静态内部类。目的是将多个 Lombok 注释合并为一个
用包括@NoArgsConstructor, @AllArgsConstructor, @Getter, @Setter
在内的更详细的集合替换@Data
注释解决了这个问题。
因此,在这种情况下,这些 Lombok 注释中的一个或多个是真正的罪魁祸首:
@ToString, @EqualsAndHashCode, @RequiredArgsConstructor
【讨论】:
以上是关于在带有 MVC REST API 的 SpringBoot 项目中返回 406 响应的主要内容,如果未能解决你的问题,请参考以下文章
在带有 MVC REST API 的 SpringBoot 项目中返回 406 响应
混合 Spring MVC + Spring Data Rest 会导致奇怪的 MVC 响应