• Lombok @Accessors(chain = true) 导致 FastJson parsObject()对父类属性失效


    我们在项目中经常会用到lombok工具对POJO类进行简化,但不可避免的存在父类和子类的设计,并且会对父类和子类进行序列化和反序列化,今天遇到了一个问题,序列化的json字符串转化为子类对象时无法获取到父类属性值,对象中所有父类属性均为空值或默认值,很是奇怪,代码如下:

    父类:People

    1. @Accessors(chain = true)
    2. @Data
    3. @ToString(callSuper=true)
    4. @EqualsAndHashCode(callSuper=false)
    5. public static class People{
    6. private String name;
    7. private Integer age;
    8. private String desc;
    9. }

    子类:Student

    1. @Accessors(chain = true)
    2. @Data
    3. @ToString(callSuper=true)
    4. @EqualsAndHashCode(callSuper=true)
    5. @NoArgsConstructor
    6. public static class Student extends People{
    7. private String nickName;
    8. private int classNo;
    9. }

    序列化和反序列代码如下:

    1. public static void main(String[] args) {
    2. Student student=new Student();
    3. student.setAge(20);
    4. student.setName("jacky");
    5. student.setNickName("BIG BOY");
    6. student.setClassNo(100);
    7. student.setDesc("He is a 20 years old boy.");
    8. String json = JSON.toJSONString(student);
    9. if(json!=null) {
    10. System.out.println(json);
    11. }
    12. Student student2=JSON.parseObject(json, Student.class);
    13. System.out.println("His name is " + student2.getName() +",age : " + student2.getAge()+ ", Class NO : "+student2.getClassNo()+",desc : "+student2.getDesc() );
    14. }

    运行结果如下:

    {"age":20,"classNo":100,"desc":"He is a 20 years old boy.","name":"jacky","nickName":"BIG BOY"}
    His name is null,age : null, Class NO : 100,desc : null
    从以上运行结果可看出,子类Student分别设对父类属性name,age,和desc进行了赋值,转为json串时,没有问题,但是从json串转为对象出现了非预期的结果,从网上找的结果来看,说是要增加

    @EqualsAndHashCode(callSuper = true)

    @ToString(callSuper = true) 

    或者增加无参构造函数,或者增加@NoArgsConstructor注解,但在我这全都无效

    经过各种排查(.....)发现是因为@Accessors(chain = true) 多了这个注解造成的,将其去掉,JSON.parseObject执行后,父类属性都可正常获得,问题得到解决

    新的运行结果如下:

    {"age":20,"classNo":100,"desc":"He is a 20 years old boy.","name":"jacky","nickName":"BIG BOY"}
    His name is jacky,age : 20, Class NO : 100,desc : He is a 20 years old boy.

    关于lombok @Accessors(chain = true) 链式编程资料有很多,初步分析这个可能是该工具的一个bug,所以请大家注意下,特此分享,未经深入分析;另外如果去掉该注解,很多基于该POJO的链式编码的判断逻辑可能都要做一些特别处理

    本项目的lombok版本:1.18.12 fastjson版本:1.1.41

    1. <properties>
    2. <lombok.version>1.18.10lombok.version>
    3. properties>
    4. <dependencies>
    5. <dependency>
    6. <groupId>com.alibabagroupId>
    7. <artifactId>fastjsonartifactId>
    8. <version>1.1.41version>
    9. dependency>
    10. <dependency>
    11. <groupId>org.projectlombokgroupId>
    12. <artifactId>lombokartifactId>
    13. <optional>trueoptional>
    14. dependency>
    15. dependencies>

    可能下面的作者分析有一些思路:

    @Accessors(chain = true)导致BeanUtils.copyProperties失效问题的排查思路_@accessors(chain=true)-CSDN博客

    关于lombok介绍:极简代码神器:Lombok使用教程

    https://www.cnblogs.com/javazhiyin/p/11271811.html

  • 相关阅读:
    【算法导论】摊还分析
    《XSS-Labs》02. Level 11~20
    第三章:人工智能深度学习教程-基础神经网络(第二节-ANN 和 BNN 的区别)
    vue2学习之路由(router以及vue-router)
    vue3点击表格某个单元格文本就切换成输入框,其他单元格不变化
    Lifecycle 一篇文章就够了
    javaweb
    七、Thymeleaf对象的访问
    浏览器唤起钉钉 各项功能
    汇集YOLO系列经典和前沿算法,实现高精度实时检测!
  • 原文地址:https://blog.csdn.net/lanisa/article/details/133283991