问题描述
POJO的属性是布尔类型的时候,采用is_xxx的命名方式,出现参数无法找到的情况
问题复现
Boolean 的属性命名为isA,但是它的getter和setter自动取消了is
public class Person {
Boolean isA;
public Boolean getA() {
return isA;
}
public void setA(Boolean a) {
isA = a;
}
}
前后端传递对象通过fastjson序列化
Person person = new Person();
person.setA(true);
System.out.println(person);
// 将Java对象转换为json字符串
String jsonString= JSON.toJSONString(person);
System.out.println(jsonString);
Person{isA:true}
{"a":true}
可以看到经过序列化后的对象的isA属性变成了a,因此前端就可能出错
前端传过来json,后端解析错误
String jsonString = "{\"isA\":true}";
// 将json反序列化为Java对象
Person person1 = JSON.parseObject(jsonString,Person.class);
System.out.println(person1);
Person{isA:null}
原因
- 在idea自动生成getter和setter的时候,自动忽略了is
- fastjson序列化的时候,遍历getter,去掉get,后面的当作属性名,
- fastjson反序列化的时候,属性名加上set,遍历setter
解决方法
1.更正getter和setter(不推荐)
1.1手动更正,太麻烦
public Boolean getIsA() {
return isA;
}
public void setIsA(Boolean a) {
isA = a;
}
1.2更正idea的代码模板,但是不符合大众的习惯
- 解决当boolean类型的变量命名由is开头时,IDEA自动生成get、set方法的问题 - 复制粘贴一把梭 - 博客园 (cnblogs.com)
1.3 使用lombok,不是所有项目都会用
2. 更正属性命名isXXX为XXX(推荐)
遵循这样的编码命名规范,那么所有的问题都会得到解决,最简单
这也是阿里手册建议的
3. 更换序列化方式(不推荐)
序列化方式有两种
- jdk原生
- json
- fastjson
- jackson
- gson
fastjson 和jackson都是通过getter和setter来为属性赋值的,但是gson是直接通过属性来赋值,因此也不会出现上面的问题
但是国内项目用fastjson还是比较多的,jackson是springboot默认的
拓展
属性命名一般不要使用基本数据类型
使用boolean的情况略有不同,无论是idea自动生成还是lombok的get方法都变为isA()
boolean isA;
public boolean isA() {
return isA;
}
public void setA(boolean a) {
isA = a;
}
但是出现的问题和上面是一样的
默认值不是null,是false,在一些情况下是逻辑不合理的,因此不建议使用基本数据类型作为属性,这也是阿里手册强制的
参考资料
- 解决当boolean类型的变量命名由is开头时,IDEA自动生成get、set方法的问题 - 复制粘贴一把梭 - 博客园 (cnblogs.com)
- java 序列化boolean时属性名前的is被遗漏的原因、解决方案及思考_对象序列化 布尔值加is_500InternalServerErr的博客-CSDN博客
- POJO类中布尔类型的变量都不要加is前缀详解 - flunggg - 博客园 (cnblogs.com)
- 为什么阿里巴巴开发手册强制规定POJO 类中布尔类型的变量,都不要加 is 前缀_o慕容紫英o的博客-CSDN博客