Spring Boot项目中使用@RequestBody接收请求数据,前端通过json格式传递数据,发现获取不到所发送的部分数据
- 实体类
@ApiModel(value = "码表分类")
@Data
public class ClassVo {
@ApiModelProperty(value = "码表分类编号", required = true)
private String cId;
@ApiModelProperty(value = "码表分类名", required = true)
private String name;
@ApiModelProperty(value = "备注", required = false)
private String memo;
}
- 响应方法
获得请求数据,以json格式再返回’
@PostMapping(value = "/class")
public CommonreturnType insertClass(@RequestBody ClassVo classVo){
return CommonreturnType.create(classVo);
}
- 请求数据
{
"cId": "01",
"name": "测试",
"memo": "测试"
}
- 返回结果
{
"status": "success",
"data": {
"cId": null,
"name": "测试",
"memo": "测试"
}
}
很惊奇的发现,传入的参数cId并没有被解析到实体类中,返回结果中为null
- 多次测试后发现:
如果参数第一个字母为小写,第二个字母为大写,就不能正常的从JSON中解析出来,如:cId,mName,aBcd
等参数都不能被正常的解析,而myName,abCd
等最前面不止一个字母小写的情况是可以用的
- 结论:@RequestBody接收的实体类中的属性名如果是第一个字母小写第二个字母大写的情况,不能正常的从JSON转换成实例类属性
- 解决方案:
- 方案一:改名字,第二个大写的改成小写就行了(实际开发中改名字使名字不符合驼峰命名法不恰当)
- 方案二:加上@JsonProperty注解,指定某个方法JSON转换时的名字,上述实体类将修改为
@ApiModel(value = "码表分类")
@Data
public class ClassVo {
@ApiModelProperty(value = "码表分类编号", required = true)
private String cId;
@ApiModelProperty(value = "码表分类名", required = true)
private String name;
@ApiModelProperty(value = "备注", required = false)
private String memo;
@JsonProperty(value = "cId")
public String getcId() {
return cId;
}
@JsonProperty(value = "cId")
public void setcId(String cId) {
this.cId = cId;
}
}
因为使用的lambok的@Data注解没有显式的setter和getter,所以自己写一个setter和getter,然后在上面注明解析时的名字就可以了