控制器在一个环境上接受null作为请求主体,但在另一个环境上拒绝

时间:2019-05-08 13:39:33

标签: java spring

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

我的Spring控制器如下(两个环境之间相同)

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

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

enter image description here

但是,当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发出的请求的屏幕截图。

enter image description here

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

1 个答案:

答案 0 :(得分:1)

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

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

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