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服务更新方式,步骤很简单:
- 给控制器方法的参数加上
@RequestBody注解,告诉Spring从请求体中解析JSON数据:
@RequestMapping(value = "/reports/update", method = RequestMethod.PUT) public ResponseMessage updateReport(@RequestBody ReportPreference reportPreference) { //... }
- 在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
相关产品推荐
相关产品推荐

