SpringBoot 使用@RequestBody 接收不到参数的问题

1、POST请求,payload中参数是有值的,但是后端接收不到,

后端仅接收到了name,而NickNameAgeJob 均为接收到参数

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注解,自动生成的SetterGetter,所以要求传参属性名大小写保持一致,必须一模一样

解决方案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/jsonjson格式参数,虽然不会报错,但后端是一个也收不到的

原因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注解即可

变更后

可以看到,请求正常

完结

posted @ 2021-09-11 13:51  Journey&Flower  阅读(13963)  评论(0)    收藏  举报