SpringBoot 使用@RequestBody 接收不到参数的问题
1、POST
请求,payload
中参数是有值的,但是后端接收不到,
后端仅接收到了
name
,而NickName
、Age
、Job
均为接收到参数
curl --location 'http://127.0.0.1/v1/testHub/example' \
--header 'Content-Type: application/json' \
--data '{
"name": "lisa",
"NickName":"nick-lisa",
"Age": 22,
"Job": "BA"
}'
原因1
后端没接收到的参数,均是请求中的参数都是首字母大写的CamelCase
(大驼峰命名),而后端属性定义为camelCase
(小驼峰命名),而后端又是使用的Lombok
的@Data
注解,自动生成的Setter
和Getter
,所以要求传参属性名大小写保持一致,必须一模一样
解决方案1.1
将传参的payload
属性改为和后端接收bean
属性保持一致
解决方案1.2
如果前端不是我们能控制的,
没办法要求别人改,我们在后端接收参数的位置可以变更
在属性上加上@JsonProperty
注解
@Data
public class Person {
private String name;
@JsonProperty(value = "NickName")
private String nickName;
@JsonProperty(value = "Age")
private Integer age;
@JsonProperty(value = "Job")
private String job;
}
特别注意
如果我们后端接口接收参数时候没有写
@RequestBody
注解,那么我们正常 以Content-Type=application/json
的json
格式参数,虽然不会报错,但后端是一个也收不到的
原因2:
2.1、请求内容 Content-Type=application/x-www-form-urlencoded
同样的接口请求,
负载格式变为了url
拼接参数
导致无法请求
curl --location 'http://127.0.0.1/v1/testHub/example' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'name=lisa' \
--data-urlencode 'NickName=nick-lisa' \
--data-urlencode 'Age=22' \
--data-urlencode 'Job=BA'
2.2、请求内容 Content type=multipart/form-data
同样的接口请求,
负载格式变为了from
表单
导致无法请求
curl --location 'http://127.0.0.1/v1/testHub/example' \
--form 'name="lisa"' \
--form 'NickName="nick-lisa"' \
--form 'Age="22"' \
--form 'Job="BA"'
解决方式2:
删除接口参数前的
@RequestBody
注解即可
变更后
可以看到,请求正常
完结
本文作者:Journey&Flower
本文链接:https://www.cnblogs.com/JourneyOfFlower/p/15221661.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步