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

2023-05-16

  假设有两个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

转载于:https://www.cnblogs.com/duguxiaobiao/p/11579713.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • TCP/IP协议栈概述及各层包头分析

    一 摘要 对之前几篇博文涉及到的网络通信协议进行分析 xff0c 概述出TCP IP的协议栈模型 xff0c 最后根据实例对各层包头进行分析 二 标准TCP IP协议栈模型 标准TCP IP协议是用于计算机通信的一组协议 xff0c 通常被
  • 2范数和F范数的区别

    2范数和F范数是不同的 2范数表示矩阵或向量的最大奇异值 xff0c max svd X 而 F范数表示矩阵所有元素平方和的开方根 sqrt x i j X x i j 2 转载于 https www cnblogs com yinwei
  • 网络钩子webhook

    网页开发中的网络钩子是一种通过自定义回调函数来增加或更改网页表现的方法 webhook 发布订阅模式 xff0c 与api不同的是 xff0c webhook无需发送请求即可收到监听地址发布的消息 主要用途 xff1a 更新客户端
  • free -g 说明

    free g 说明 xff1a free g 43 buffers cache 说明 xff1a buffer 写缓存 xff0c 表示脏数据写入磁盘之前缓存一段时间 xff0c 可以释放 sync命令可以把buffer强制写入硬盘 cac
  • Google Drive 里的文件下载的方法

    Google Drive 里并不提供创建直接下载链接的选项 xff0c 但是可以通过小小的更改链接形式就能把分享的内容保存到本地 例如 xff0c 一份通过 Google Drive 分享的文件链接形式为 xff1a https drive
  • 关于虚拟机VMware Tools安装中出现的无法自动安装VMCI驱动程序的问题

    问题 解决方法 根据配置文件信息找到所在的虚拟机位置 找到后缀名为vmx的文件 xff0c 右键打开方式中选择使用记事本打开 选择左上角编辑中的查找功能输入图中的查找内容后 xff0c 点击查找下一个 将其原先的TRUE值改为false即可
  • 人脸识别概念杂记

    Gabor特征 xff1a 通过Gabor变换获取的特征 Gabor变换 xff1a 是在20世纪40年代有Gabor提出的一种利用高斯函数作为窗口函数的加窗傅里叶变换 Gabor变换可以有效的获取空间和方向等视觉信息 xff0c 使得原始
  • 大麦盒子(domybox)无法进入系统解决方案!【简单几步】

    大麦无法进入系统解决方案 xff01 简单几步 前提准备 xff1a 电脑一台盒子控制台软件盒子开机并联网并且盒子和电脑处于同一个路由器下的网络 xff01 前提准备 xff1a 电脑一台盒子控制台软件盒子开机并联网并且盒子和电脑处于同一个
  • 常见开发语言擅长领域

    Python xff1a 机器学习 xff0c 数据科学还有Web开发 JavaScript xff1a Web开发 xff08 前端和后端 xff09 和游戏开发 Java xff1a 移动Android应用程序开发 xff0c 企业应用
  • H3C 维护命令

    一 xff1a 基础维护命令 1 dis version 查看版本 2 dis cu 显示实时配置 3 dis this 显示当前视图下的配置 4 dis interface 显示接口 5 dis mac address 显示mac地址表
  • ROS下利用realsense采集RGBD图像合成点云

    摘要 xff1a 在ROS kinetic下 xff0c 利用realsense D435深度相机采集校准的RGBD图片 xff0c 合成点云 xff0c 在rviz中查看点云 xff0c 最后保存成pcd文件 一 各种bug 代码编译成功
  • SQL在工作中遇到的问题

    多表查询的用法区别varchar类型的时间比大小 多表查询的用法区别 一般对于两张表的查询习惯用 select from a b where a id 61 b id 最近发现也可以使用 select from a inner join b
  • 剑指offer

    目录 第2章 面试需要的基础知识 2 3 数据结构 2 3 1 数组 xff1a 二维数组中的查找 2 3 2 字符串 xff1a 替换空格 2 3 3 链表 xff1a 从尾到头打印链表 2 3 4 树 xff1a 重建二叉树 2 3 5
  • js阻止冒泡事件发生(react)

    其实就两个函数 event MouseEvent event preventDefault span class token punctuation span span class token punctuation span span c
  • 机器学习与深度学习核心知识点总结

    来源 SIGAI 数学 1 列举常用的最优化方法 梯度下降法 牛顿法 xff0c 拟牛顿法 坐标下降法 梯度下降法的改进型如AdaDelta xff0c AdaGrad xff0c Adam xff0
  • H3C STA>PC的数据转发

    转载于 https www cnblogs com fanweisheng p 11574797 html
  • etcd查看集群信息

    查看集群服务端口地址列表 etcdctl endpoints 61 https 192 168 1 65 2379 ca file 61 etc kubernetes ssl ca pem cert file 61 etc etcd ssl
  • Win10提示无法创建新的分区也找不到现有的分区解法

    原文链接 xff1a https www pconline com cn win10 1126 11261093 html 1 格式化整个硬盘 xff0c 重新分区 如果你的硬盘上没有重要数据的话 xff0c 到了分区这一步时 xff0c
  • 数据融合(data fusion)原理与方法

    数据融合 xff08 data fusion xff09 原理与方法 数据融合 xff08 data fusion xff09 最早被应用于军事领域 现在数据融合的主要应用领域有 xff1a 多源影像复合 机器人和智能仪器系统 战场和无人驾
  • 单目运算符-双目运算符-三目运算符

    1 单目运算符 xff1a 只对一个变量进行操作 a 43 43 xff1b 2 双目运算符 xff1a 对两个变量进行操作 xff1b a 61 1 b 61 3 c 61 a 43 b 就是双目运算符 xff1b 3 三目运算符 xff

随机推荐