当前位置:网站首页>阿里巴巴规范之POJO类中布尔类型的变量都不要加is前缀详解

阿里巴巴规范之POJO类中布尔类型的变量都不要加is前缀详解

2022-08-11 05:35:00 geekmice

说明
【强制】POJO 类中的任何布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列
化错误。
说明:在本文 MySQL 规约中的建表约定第一条,表达是与否的变量采用 is_xxx 的命名方式,所以,需要
在设置从 is_xxx 到 xxx 的映射关系。

反例:定义为基本数据类型 boolean isDeleted 的属性,它的方法也是 isDeleted(),框架在反向解析的时
候,“误以为”对应的属性名称是 deleted,导致属性获取不到,进而抛出异常。

问题复现

准备工作
1、需要的依赖

  <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.58</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.9.8</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.5</version>
        </dependency>

2、对应java文件

public class App {
    
    public static void main(String[] args) {
    
        TempOne temp = new TempOne();
        temp.setLive(true);
        TempTwo tempTwo = new TempTwo();
        tempTwo.setLive(true);
        System.out.println("temptwo isLive:" + new Gson().fromJson(JSON.toJSONString(tempTwo),TempTwo.class));
        System.out.println("temp live:"+ new Gson().fromJson(JSON.toJSONString(temp), TempOne.class));
    }

}

3、执行后效果

temptwo isLive:TempTwo{isLive=false}
tempone live:Temp{live=true}

4、结果分析
TempTwo类已经将isLive属性设置为true,为什么返回确是false,原因是因为JSON框架通过扫描所有的getter后发现有一个isLive方法,然后根据JavaBeans的规范,解析出变量名为live,把model对象序列化城字符串后内容为{“live”: true}。
然后根据{“live”: true}这个json串,Gson框架在通过解析后,通过反射寻找People类中的live属性,但是TempTwo类中只有isLive属性,找不到对应的属性,所以,最终反序列化后的TempTwo类的对象中,isLive则会使用默认值false
这样导致前台布尔类型数据送不到后台,由于前台传过来会把命名为isX的变量解析为X,但是我们pojo类中布尔类型属性是isX,导致找不到X,故而传递值失败;
最终解释了:pojo类布尔类型变量都不要加is前缀

注意点

所有的POJO类属性必须使用包装数据类型。
RPC方法的返回值和参数必须使用包装数据类型。
所有的局部变量使用基本数据类型。
boolean类型的默认值为false;而Boolean类型的默认值是null

原网站

版权声明
本文为[geekmice]所创,转载请带上原文链接,感谢
https://blog.csdn.net/greek7777/article/details/125954870