首页 > 解决方案 > 控制器在一个环境中接受 null 作为请求主体,但在另一个环境中拒绝

问题描述

我在生产环境和开发环境之间遇到了令人费解的行为。

我的Spring控制器如下(两个环境一样)

    @RequestMapping(value = "/find")
    @ResponseBody
    public List<D> find(@RequestBody P params) throws Exception {
        // omitted
    }

当 Chrome 在生产环境中完成请求时,浏览器会收到正确的响应:

在此处输入图像描述

但是,当请求由 Chrome 在开发环境中完成时,Spring 会打印一个警告(警告指向缺少请求正文)

WARN [qtp543254421-52] AbstractHandlerExceptionResolver.java:197 -
Resolved 
[org.springframework.http.converter.HttpMessageNotReadableException: 
Required request body is missing: public java.util.List<D> 
pl.kg.ut.postgres.controller.ReadPostgresController.find(P) throws java.lang.Exception]

这是来自 Chrome 的请求的屏幕截图。

在此处输入图像描述

当我们比较两个请求(来自 dev 和 prod)时,会有一些相似之处和不同之处。请求 URL、请求方法和请求有效负载是相同的。(引人注目的是 Request Payload 为空,但控制器需要一个有效负载。)不同的是请求标头:当从生产中发出请求时,请求标头会更多。

标签: javaspring

解决方案


您绝对不应该使用正文获取 HTTP 方法请求以进行解析。

数据封装是通过 HTTP POST 完成的,用于存储请求的主体。请尝试在下面定义代码以发布有效负载。

@RequestMapping(value = "/find", method=RequestMethod.POST)
@ResponseBody
public List<D> find(@RequestBody P params) throws Exception {
    // omitted
}

推荐阅读