带有@RequestParam和@RequestBody的Spring @GetMapping因HttpMessageNotReadableException而失败

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带有@RequestParam和@RequestBody的Spring @GetMapping因HttpMessageNotReadableException而失败相关的知识,希望对你有一定的参考价值。

对端点的请求失败,并显示以下错误:

400错误请求org.springframework.http.converter.HttpMessageNotReadableException:缺少必需的请求正文

@GetMapping
public List<SomeObject> list(@RequestParam(required = false) String parameter, @RequestBody String body, @RequestHeader("Authorization") String token) {
.....
}

如果将@GetMapping改为@PostMapping,那么一切都像魅力一样。有什么想法到底是怎么回事?

注意:Swagger用于请求发送,因此错误不太可能在Curl中

更新:所以,看起来Spring不支持@RequestBody@GetMapping。我还是想不通为什么? @DeleteMapping@RequestBody工作正常,根据HTTP / 1.1 GET请求可能包含正文 - stackoverflow.com/questions/978061/http-get-with-request-body

IMO看起来有点不一致允许在DELETE身体,但禁止在GET

答案

@RequestBody注释使用带注释的变量绑定(POST / PUT)请求体中发送的内容。由于GET请求中没有“body”部分,因此spring抛出HttpMessageNotReadableException来指示相同的内容。

作为一般规则,您只能将@RequestBody用于具有“正文”内容的请求,例如POST或PUT。

另一答案

我今天在spring-webmvc 5.1.5中遇到了类似的问题并检查了库代码。 HttpMessageNotReadableException是从RequestResponseBodyMethodProcessor.readWithMessageConverters抛出的,因为它引用了readWithMessageConverters并获得了null。在readWithMessageConverters中有一个循环为请求Content-Type(for (HttpMessageConverter<?> converter : this.messageConverters))搜索合适的转换器,并且因为我没有在请求中指定和Content-Type,它失败了。

所以我指定了标题Content-Type: application/json并解决了问题。

以上是关于带有@RequestParam和@RequestBody的Spring @GetMapping因HttpMessageNotReadableException而失败的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC - 为啥不能同时使用 @RequestBody 和 @RequestParam

@RequestParam 中的单元测试占位符 defaultValue

在 Kotlin 中与 @RequestParam 一起使用时,自定义 HashMap 类获取参数类型不匹配

接口测试之问题挖掘

@RequestParam和@RequestBody的区别

@RequestBody和@RequestParam区别