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

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

  1. spring 工具类大集合

    接以前的文章 apache-commons 常用工具类 和文章 apache-commons 工具类扩展 小家 Spring 对 spring 的工具类做了详细的介绍(一) 这里我抽出一些好用的类,不 ...

  2. Spring工具类 非spring管理环境中获取bean及环境配置

    SpringUtils.java import org.springframework.beans.BeansException; import org.springframework.beans.f ...

  3. JDBC JdbTemplate&NamedParameterJdbcTemplate(Spring工具类)

    使用该工具类需要从spring开发包中导入spring.jar和commons-logging.jar,这个模板是线程安全的.   JdbcTemplate: public class JdbcTem ...

  4. java springboot调用第三方接口 借助hutoool工具类 爬坑

    楼主是个后端小白一枚,之前没接触过后端,只学了java基本语法,还是在学校老师教的,学的很浅,什么ssh.ssm框架都没有学,最近在自学spring boot,看书学也看不是很懂,就在b站上看教学视频 ...

  5. 使用POI导出EXCEL工具类并解决导出数据量大的问题

    POI导出工具类 工作中常常会遇到一些图表需要导出的功能,在这里自己写了一个工具类方便以后使用(使用POI实现). 项目依赖 <dependency> <groupId>org ...

  6. Spring工具类:WebApplicationContextUtils

    当 Web 应用集成 Spring 容器后,代表 Spring 容器的WebApplicationContext对象将以 WebApplicationContext.ROOT_WEB_APPLICAT ...

  7. Java并发工具类之线程间数据交换工具Exchanger

    Exchanger是一个用于线程间协做的工具类,主要用于线程间的数据交换.它提供了一个同步点,在这个同步点,两个线程可以彼此交换数据.两个线程通过exchange方法交换数据,如果一个线程执行exch ...

  8. 利用BeanUtils工具类封装表单数据

    一.BeanUtils工具类的使用 1.首先导入BeanUtils工具类的jar包 commons-beanutils-1.8.0.jar commons-logging-1.1.1.jar 2.se ...

  9. spring工具类获取bean

    import org.springframework.web.context.ContextLoader; import org.springframework.web.context.WebAppl ...

随机推荐

  1. 005-tomcat日志体系

    一.概述 首先了解java的日志体系 在JDK1.4后,sun公司增加了一个包为java.util.logging,简称为jul,用以对抗log4j. 后续还有很多日志门面方案,但是tomcat使用了 ...

  2. 算法习题---4-3黑白棋(UVa220)

    一:题目 系统提示当前旗手W/B(白/黑)下子,例如W下子,那么W下的位置必须是夹住黑色棋子的位置才可以. 夹住方式:横向.竖向.斜向 注意落子后将夹住的黑棋吞噬变为白棋 (一)题目详解 .棋盘以数组 ...

  3. 123457123456---com.threeObj03.FanPaiZi01--- 记忆翻牌儿童

    com.threeObj03.FanPaiZi01--- 记忆翻牌儿童

  4. 执行spark-shell报错:

    执行spark-shell报错: [ERROR] Terminal initialization failed; falling back to unsupportedjava.lang.NoClas ...

  5. 容器版单个jenkins实现CI/CD----带solo博客开源项目

    实验架构: 192.168.0.96 gitlab 192.168.0.97 jenkins.docker-1.7 192.168.0.98 harbor.docker-1.7集群 jenkins安装 ...

  6. Yarn使用笔记

    1.安装需要下载安装包(这里只介绍windows系统的安装) 安装成功,会如图提示! 版本号:Yarn安装包-yarn-0.24.6 安装包下载地址:链接:http://pan.baidu.com/s ...

  7. C入门笔记

    教程总体概括:Mac OS X系统简介:C语言:OC语言:Foundation:iOS开发:项目实战. 3.第一个c语言程序#include <stdio.h>//预处理指令:在编译之前执 ...

  8. Windows 10 下使用 MinGW-w64 编译 OpenCV-4.1.1

    1. 下载安装 CMake 2. 下载安装 MinGW-w64,假设安装于 X:\path\to\MinGW-w64 此处注意选择 POSIX 版本而非 Win32 版本,因为 OpenCV 调用了标 ...

  9. Net上传文件

    Net上传文件 最近工作内容涉及到一点前端的内容,把学习到的内容记录下来,在今后的开发过程中,不要犯错.本篇只针对一些刚入职的小白及前端开发人员,大牛请绕道!~ 刚开始我们先不讲上传文件的防范问题,先 ...

  10. Nuget下载 MySql.Data 连接MySql数据库

    打开VS项目,右键项目选择 右上角搜索框中搜索 MySql.Data 然后可以选择安装,但是可能会出现这个提示 这是因为版本的问题,所以,自己去官网重新下载,我这里选择的是这个版本, 官网地址: ht ...