You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring Boot POST请求大尺寸参数接收为空问题求助

解决Spring Boot @RequestParam接收大字符串为空的问题

这个坑我之前踩过!你遇到的情况本质是Spring Boot默认限制了URL/表单参数的大小——@RequestParam是从请求的查询参数(URL里的?xxx=xxx)或者表单参数中取值的,而不管是内置的Tomcat服务器还是Spring本身,对这类参数的默认大小都有严格上限,刚好卡在你说的2M左右,超过后服务器会悄悄截断参数,导致控制器拿到空字符串,而且默认日志级别下不会输出错误信息,所以你看不到异常。

下面给你两种解决方案,按需选择:

方案一:改用@RequestBody接收(推荐)

大文本内容本来就不适合放在URL或表单参数里,直接把字符串放在请求体中,用@RequestBody接收是更规范的做法,也不会有大小限制(只要服务器内存足够)。修改控制器代码如下:

@PostMapping(value = "/func")
public ResponseMessage func(@RequestBody String message) {
    if(StringUtils.isEmpty(message)) {
        // 你的告警逻辑
    }
    // 后续业务处理
}

同时要调整发送端代码,把字符串放在请求体中发送(而不是作为form参数或query参数),比如用OkHttp、RestTemplate时设置请求体为该字符串即可。

方案二:调整服务器参数(如果必须用@RequestParam)

如果因为业务限制必须用@RequestParam,那需要修改Spring Boot的配置,放宽参数大小限制:
application.properties(或application.yml)中添加以下配置:

# 允许POST表单的最大内容大小(这里设为10MB,可根据你的需求调整)
server.tomcat.max-form-content-size=10MB
# 如果你的参数是放在URL查询字符串里,还要调整这个(默认是10KB)
server.tomcat.max-http-header-size=10MB

注意:如果是Spring Boot 2.x之前的版本,max-form-content-size对应的配置是server.tomcat.max-post-size

这样调整后,服务器就能接收更大的参数了,不会再出现截断为空的情况。

内容的提问来源于stack exchange,提问作者KAs

火山引擎 最新活动