从Sping Boot 2.1.10迁移到2.2.4之后,下面的方法开始为params
参数返回null。这不是Spring中的一个bug,因为当我制作一个小的示例项目时它就可以工作了。它也适用于没有Content-Type的普通GET和POST:application/x-www-form-urlencoded.
@PostMapping(path = "/test", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public void test(@RequestParam Map<String, String> params) {
System.out.println(params);
}
我触发下面的请求,它在一个项目中有效,但在另一个项目中无效。我试过禁用所有过滤器和参数解析器,但都不起作用。
curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "param1=1¶m2=2" http://localhost:8080/test
任何帮助或想法将不胜感激。另外,如果有人能告诉我Spring解析参数的位置,我可以尝试调试并看看会发生什么。
3条答案
按热度按时间i5desfxk1#
添加另一个答案,因为我遇到了同样的问题,但解决它的方式不同。
我也有一个请求日志过滤器,它 Package 了传入的请求,并以JonasPedersen在回答中描述的类似方式缓存了响应输入流。Sping Boot 从2.1.2.RELEASE更新到2.3.4.RELEASE
我将传入的请求 Package 在一个缓存请求 Package 器中,该 Package 器缓存输入流。对我来说,问题是由于某些原因(目前还不知道)request.getParameterValue(String key)方法返回null,即使 Package 的请求显然有一个非空的参数Map。简单地访问 Package 的请求参数Map就解决了我的问题……非常奇怪。
原始的 Package 器类,与Sping Boot 2.1.2.RELEASE一起使用:
为简洁起见,省略了CachedInputStream类的实现。
简单地访问 Package 的请求Map似乎可以解决整个问题。对于Sping Boot 2.3.4.RELEASE,此版本有效(我删除了一些细节):
我没有费心去深入研究这个问题,所以我不能说两个Sping Boot 版本之间发生了什么变化,或者在wrappers构造函数中访问参数Map解决了什么问题。
h4cxqtbf2#
经过无数个小时的调试,原来是一个日志过滤器的问题。我是这样阅读请求的:
这消耗了来自内容类型
application/x-www-form-urlencoded
的查询参数。我的解决方案是不阅读application/x-www-form-urlencoded
的输入流。juud5qan3#
如果您也使用日志,则可能发生这种情况。参见https://github.com/zalando/logbook/issues/1077
显然,禁用表单日志记录可以修复它。