前言
前段时间开发碰到一个问题,因为Mysql数据库没有布尔类型,POJO 类中布尔类型的变量有布尔变量(可用0和1来代替),存的时候没有问题,可取的时候却出现问题。无论0还是1,在将POJO类序列化成JSON数据后,前端判断始终出错,都解析为一样的值。 找了半天,没找到问题,最后想想是不是is开头的问题,结果去掉is,正常解析了(这里是isS开头),后来查了下资料知道大概原因。
导致问题出现的原因
而对于boolean类型的参数,我们可能会这样命名
private boolean isSuccess;
public boolean isSuccess() {
return isSuccess;
}
public void setSuccess(boolean success) {
isSuccess = success;
}
这种方式在某些时候是可以正常运行的,但是在一些rpc框架里面,当反向解析读取到isSuccess()方法的时候,rpc框架会“以为”其对应的属性值是success,而实际上其对应的属性值是isSuccess,导致属性值获取不到,从而抛出异常。 而阿里规范手册也有提到 POJO 类中布尔类型变量都不要加 is 前缀,否则部分框架解析会引起序列化错误。
反例:定义为基本数据类型 Boolean isDeleted 的属性,它的方法也是 isDeleted(),RPC 框架在反向解
析的时候,“误以为”对应的属性名称是 deleted,导致属性获取不到,进而抛出异常。
规范这东西还是很重要的
- 属性名应该是具有定义语义的有意义的名称。
- 属性名必须是驼峰式的,ASCII码字符串。
- 首字符必须式字母,下划线(_)或美元符号($)。 随后的其他字符可以是字母,数字,下划线(_)或美元符号($)。
- 应该避免使用Javascript中的保留关键字
- POJO 类中布尔类型的变量,都不要加 is,否则部分框架解析会引起序列化错误。
- 尽量别使用二个大写字母一起,可能会出现莫名其妙错误
{
"canPigsFly": null, // null
"areWeThereYet": false, // boolean true or false
"answerToLife": 42, // number
"name": "Bart", // string
"moreData": {}, // object
"things": [] // array
}
本文由 止戈 创作,采用 知识共享署名4.0
国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Jan 6,2020