【Java】POJO类的属性不要命名为isXXX的问题描述,复现,解决方法

问题描述

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}

原因

  1. 在idea自动生成getter和setter的时候,自动忽略了is
  2. fastjson序列化的时候,遍历getter,去掉get,后面的当作属性名,
  3. 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,不是所有项目都会用
【Java】POJO类的属性不要命名为isXXX的问题描述,复现,解决方法_第1张图片

2. 更正属性命名isXXX为XXX(推荐)

遵循这样的编码命名规范,那么所有的问题都会得到解决,最简单
这也是阿里手册建议的
【Java】POJO类的属性不要命名为isXXX的问题描述,复现,解决方法_第2张图片

3. 更换序列化方式(不推荐)

序列化方式有两种

  1. jdk原生
  2. json
    1. fastjson
    2. jackson
    3. 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;  
}

【Java】POJO类的属性不要命名为isXXX的问题描述,复现,解决方法_第3张图片

但是出现的问题和上面是一样的

默认值不是null,是false,在一些情况下是逻辑不合理的,因此不建议使用基本数据类型作为属性,这也是阿里手册强制的
image.png【Java】POJO类的属性不要命名为isXXX的问题描述,复现,解决方法_第4张图片

参考资料

  • 解决当boolean类型的变量命名由is开头时,IDEA自动生成get、set方法的问题 - 复制粘贴一把梭 - 博客园 (cnblogs.com)
  • java 序列化boolean时属性名前的is被遗漏的原因、解决方案及思考_对象序列化 布尔值加is_500InternalServerErr的博客-CSDN博客
  • POJO类中布尔类型的变量都不要加is前缀详解 - flunggg - 博客园 (cnblogs.com)
  • 为什么阿里巴巴开发手册强制规定POJO 类中布尔类型的变量,都不要加 is 前缀_o慕容紫英o的博客-CSDN博客

你可能感兴趣的:(java,开发语言)