• 借助Spring工具类如何实现支持数据嵌套的赋值操作


      假设有两个Bean A和B,想将B中的属性赋值到A实体中,可以使用get set来实现,当属性过多时,就会显得很冗余,可以使用spring提供的BeanUtils.copyProperties()来实现,但是这种方法在面对 对象中存在集合,更可能存在对象中的集合中的集合,这种赋值操作,该方法无法实现,那么想要实现该操作,可以借助 Spring的 BeanWrapper 类来实现,下面来举一个例子
            假设存在一个School类,该学校中存在普通的数据类型schoolName,存在对象类型Clazz,存在集合类型,通过特殊的写法给该对象赋值。
     

    1. Student类

    package com.lonely.test;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    import java.util.List;
    
    /**
     * @author ztkj-hzb
     * @Date 2019/9/24 10:48
     * @Description
     */
    @Data
    public class School {
    
        private String schoolName;
    
        private Clazz clazz;
    
        private List<Teacher> teachers;
    
        @Data
        @AllArgsConstructor
        @NoArgsConstructor
        public static class Clazz {
    
            private String clazzName;
    
            private List<Student> students;
        }
    
    
        @Data
        @AllArgsConstructor
        @NoArgsConstructor
        public static class Student {
    
            private String stuName;
    
            private Integer age;
        }
    
        @Data
        @AllArgsConstructor
        @NoArgsConstructor
        public static class Teacher{
    
            private String teacherName;
    
            private List<Student> students;
        }
    
    }

    2. 通过以下方法给该对象赋值

    public static void main(String[] args) {
    
    
            School school = new School();
    
            BeanWrapper beanWrapper = PropertyAccessorFactory.forBeanPropertyAccess(school);
            //todo 这句话很重要,取值可以不用设置,但是赋值一定需要,因为他的作用是在对象属性为null时,会帮你new一个,避免了空指针异常
            beanWrapper.setAutoGrowNestedPaths(true);
    
            //赋值操作,操作方法属性.属性的方式,如果是集合或者是数组,使用下标 xx[0]. 的方式,根据我目前的测试,暂时无法支持Set,可能因为Set
            //无索引操作吧
            beanWrapper.setPropertyValue("schoolName","无敌高中");
            beanWrapper.setPropertyValue("clazz.clazzName","终极一班");
            beanWrapper.setPropertyValue("clazz.students[0].stuName","lonely");
            beanWrapper.setPropertyValue("clazz.students[0].age",18);
            beanWrapper.setPropertyValue("clazz.students[1].stuName","dugu");
            beanWrapper.setPropertyValue("clazz.students[1].age",20);
    
            beanWrapper.setPropertyValue("teachers[0].teacherName","teacher1");
            beanWrapper.setPropertyValue("teachers[0].students[0].stuName","学生One");
            beanWrapper.setPropertyValue("teachers[0].students[0].age",20);
            beanWrapper.setPropertyValue("teachers[0].students[1].stuName","学生Two");
            beanWrapper.setPropertyValue("teachers[0].students[1].age",25);
    
            System.out.println(school);
        
            //取值,跟赋值类似
            System.out.println(beanWrapper.getPropertyValue("teachers[0].teacherName"));
    
    
    }

    3. 以上demo只是测试使用而已,本人在公司需要的场景下写了一些工具类,包括了如何根据指定的参数类型,构建一个Class对象,将结果Map格式的数据,转换成实体Bean中,支持嵌套赋值,更有满足公司场景的左右赋值需要,即根据前端配置的赋值表达式,将右侧的值成功赋值给左侧的对象中,目前还是在尝试研发中,需要Demo的可以在以下的Github中下载。https://github.com/duguxiaobiao/generator-code

  • 相关阅读:
    SGU 106 The equation 扩展欧几里德
    poj 2478 Farey Sequence 欧拉函数前缀和
    uva 11752 The Super Powers 素数+大数判断大小
    Lightoj 1370 素数打表 +二分
    vijos 1250 最勇敢的机器人 分组背包+并查集
    Codeforces Round #366 (Div. 2) A , B , C 模拟 , 思路 ,queue
    BZOJ 4034: [HAOI2015]T2 树链剖分
    BZOJ 1057: [ZJOI2007]棋盘制作 悬线法求最大子矩阵+dp
    BZOJ 1260: [CQOI2007]涂色paint 区间DP
    BZOJ 1264: [AHOI2006]基因匹配Match 树状数组+DP
  • 原文地址:https://www.cnblogs.com/duguxiaobiao/p/11579713.html
Copyright © 2020-2023  润新知