java - 控制器在一个环境中接受 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 为空,但控制器需要一个有效负载。)不同的是请求标头:当从生产中发出请求时,请求标头会更多。
解决方案
您绝对不应该使用正文获取 HTTP 方法请求以进行解析。
数据封装是通过 HTTP POST 完成的,用于存储请求的主体。请尝试在下面定义代码以发布有效负载。
@RequestMapping(value = "/find", method=RequestMethod.POST)
@ResponseBody
public List<D> find(@RequestBody P params) throws Exception {
// omitted
}
推荐阅读
- python - 我在处理 django 项目时无法修复错误,TypeError: expected str, bytes or os.PathLike object, not function
- amazon-web-services - Redshift COPY 命令中的时间戳格式无效
- python - 我需要将一些字典键从字符串转换为整数,但我得到一个“invalid literal for int() with base 10”
- arrays - QVector + QScopedPointer - 传递给 C 运行时函数的无效参数
- angular - 导航/路由回组件时不会触发 ngOnInit
- c# - 有人可以帮我解释一下吗
- apache - Mod用变量重写
- c# - 如何测试逻辑树 - 10 个意外的测试结果
- python - 检查是否输入了文本文件中的单词,不起作用
- udp - 是否可以通过 Wireshark 检测所有多播 ip?