You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot REST服务PUT请求参数对象字段为空问题求助

问题分析与解决方案

这个问题我之前也碰到过,核心原因是Spring Boot默认不解析PUT请求的表单数据,再加上控制器参数的绑定方式没匹配请求格式,导致Postman的PUT请求参数为空,而Swagger能正常工作是因为它的请求格式刚好和Spring的解析逻辑匹配上了。

为什么会出现这个差异?

  • Swagger UI正常:Swagger默认发送PUT请求时,会把参数放在请求体里用application/json格式传输。不过严格来说,你的控制器方法如果没有@RequestBody注解,Spring其实无法自动把JSON请求体绑定到ReportPreference对象上——大概率是你的Swagger配置里把参数设为了URL查询参数,或者你实际代码中悄悄加了注解没贴出来😉。
  • Postman的PUT请求失败:如果你的Postman是用form-data或application/x-www-form-urlencoded(表单格式)发送PUT请求,Spring Boot默认不会解析这类PUT请求的表单数据,而POST请求是默认支持表单解析的,所以其他方法能正常工作。

解决方案

方案1:使用JSON请求体(REST API标准做法)

这是最推荐的REST服务更新方式,步骤很简单:

  1. 给控制器方法的参数加上@RequestBody注解,告诉Spring从请求体中解析JSON数据:
@RequestMapping(value = "/reports/update", method = RequestMethod.PUT)
public ResponseMessage updateReport(@RequestBody ReportPreference reportPreference) {
    //...
}
  1. 在Postman中调整请求格式:选择Body -> raw -> 下拉选JSON,输入对应的JSON参数,发送请求后参数就能正常绑定了。

方案2:支持表单格式的PUT请求(仅适配特殊场景,不推荐)

如果你因为某些原因必须支持表单格式的PUT请求,可以启用Spring的HttpPutFormContentFilter来解析PUT的表单数据:

方式A:通过配置类注册Bean

在你的Spring配置类中添加这个Bean:

@Bean
public HttpPutFormContentFilter httpPutFormContentFilter() {
    return new HttpPutFormContentFilter();
}

方式B:通过配置文件开启

在application.properties中添加一行配置:

spring.mvc.formcontent.putfilter.enabled=true

开启后,Spring会自动解析PUT请求中的表单数据,不需要修改控制器方法,参数就能正常绑定了。

补充说明

为什么POST/GET/DELETE都正常?

  • POST请求:Spring默认会解析表单数据,不管是表单格式还是JSON格式(加@RequestBody的话)都能处理;
  • GET/DELETE:这类请求的参数通常放在URL查询参数或路径变量里,Spring会自动解析这些位置的参数,所以不受PUT表单解析逻辑的影响。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 06:57:31