项目场景:
项目场景:在一个普通项目的注册接口中
问题描述
在Spring Boot项目中,当我使用@RequestBody
和@Validated
注解将HTTP POST请求的请求体绑定到实体类对象SignRequest
中时,发现无法正确将请求体JSON字符串中的realName
字段绑定到该实体类中的realName
属性,而将实体类中的realName
属性重命名为realname,并且
JSON字符串中改为realname字段
后,请求就可以正常绑定参数。
实体类部分代码
/**
* 真实姓名
*/
@NotNull(message = "realName不能为空呀")
private String realName;
控制层部分代码
@PostMapping("/signByWxCode")
public R signByWxCode(@RequestBody @Validated SignRequest params) {
return userService.signByWxCode(params);
}
请求体JSON格式
{
"wxcode": "abcdefg",
"realName": "法外狂徒张三",
"code": "123456"
}
运行结果
{
"code": 40004,
"message": "realName不能为空呀",
"data": {}
}
原因分析:
这个问题可能是由于SpringBoot默认Json框架Jackson,在将请求体JSON字符串转换为Java对象时,使用了JavaBean命名约定来匹配属性名和JSON字段名,而JavaBean命名约定要求属性名要符合驼峰命名规则,即单词之间使用大写字母分隔。
实体类SignRequest
中,属性名为realName
,但是请求体JSON字符串中的字段名为realName
,这两个名称是一样的,因此在命名上看起来似乎没有问题。但是,JavaBean命名约定将属性名中的每个单词的首字母都大写,因此属性名realName
在JavaBean命名约定下应该被解释为RealName
,而不是realName
。因此,Jackson无法自动绑定请求体JSON字符串中的realName
字段到实体类中的realName
属性。
通过在realName
属性上添加@JsonProperty("realName")
注解,您可以告诉Jackson库将realName
属性映射到JSON字段名为realName
的字段,从而解决了这个问题。
解决方案:
方法一:通过在
realName
属性上添加@JsonProperty("realName")
注解,告诉Jackson库将realName
属性映射到JSON字段名为realName
的字段。
@NotNull(message = "realName不能为空呀")
@JsonProperty("realName")
private String realName;
方法二:通过更改请求体JSON字符串来解决这个问题,将请求体JSON字符串中的
realName
字段改为real_name
形式,以避免与JavaBean命名约定冲突。这样,请求体JSON字符串中的字段名与实体类中的属性名就不会冲突,从而可以正确绑定参数。
{
"wxcode": "abcdefg",
"real_name": "法外狂徒张三",
"code": "123456"
}
然后问题就解决啦^_^
{
"code": 20000,
"message": "成功",
"data": {
"realName": "法外狂徒张三",
"tokenKey": "6c2aed1d8392802cf912f3c67377f56d"
}
}