假设有两个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")); }