【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的代码模板,但是不符合大众的习惯

1.3 使用lombok,不是所有项目都会用
image.png

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

遵循这样的编码命名规范,那么所有的问题都会得到解决,最简单
这也是阿里手册建议的
image.png

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;  
}

image.png

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

默认值不是null,是false,在一些情况下是逻辑不合理的,因此不建议使用基本数据类型作为属性,这也是阿里手册强制的
image.pngimage.png

参考资料

猜你喜欢

转载自blog.csdn.net/weixin_50799082/article/details/131307902