精华内容
下载资源
问答
  • BeanUtils.copyProperties

    2020-04-13 09:52:02
    BeanUtils.copyProperties(a, b); BeanUtils是org.springframework.beans.BeanUtils, a拷贝到b BeanUtils是org.apache.commons.beanutils.BeanUtils,b拷贝到a BeanUtil.convertList2List();copy List ...

    a,b为对象
    BeanUtils.copyProperties(a, b);
    BeanUtils是org.springframework.beans.BeanUtils, a拷贝到b
    BeanUtils是org.apache.commons.beanutils.BeanUtils,b拷贝到a
     

    BeanUtil.convertList2List();copy List

     

     

    展开全文
  • 使用BeanUtils.copyProperties进行对象之间的属性赋值

    万次阅读 多人点赞 2019-05-15 19:07:27
    1、使用org.springframework.beans.BeanUtils.copyProperties方法进行对象之间属性的赋值,避免通过get、set方法一个一个属性的赋值 /** * 对象属性拷贝 <br> * 将源对象的属性拷贝到目标对象 * * @...

    1、使用org.springframework.beans.BeanUtils.copyProperties方法进行对象之间属性的赋值,避免通过get、set方法一个一个属性的赋值

    /**
         * 对象属性拷贝 <br>
         * 将源对象的属性拷贝到目标对象
         *
         * @param source 源对象
         * @param target 目标对象
         */
        public static void copyProperties(Object source, Object target) {
            try {
                BeanUtils.copyProperties(source, target);
            } catch (BeansException e) {
                LOGGER.error("BeanUtil property copy  failed :BeansException", e);
            } catch (Exception e) {
                LOGGER.error("BeanUtil property copy failed:Exception", e);
            }
        }

    2、List集合之间的对象属性赋值

    /**
         * @param input 输入集合
         * @param clzz  输出集合类型
         * @param <E>   输入集合类型
         * @param <T>   输出集合类型
         * @return 返回集合
         */
        public static <E, T> List<T> convertList2List(List<E> input, Class<T> clzz) {
            List<T> output = Lists.newArrayList();
            if (CollectionUtils.isNotEmpty(input)) {
                for (E source : input) {
                    T target = BeanUtils.instantiate(clzz);
                    BeanUtil.copyProperties(source, target);
                    output.add(target);
                }
            }
            return output;
        }

    比如有两个类,User和Employee,将存储Employee对象的List赋给存储User对象的List。

    User类:

    public class User {
        private String name;
        private Integer age;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }

    Employee类:

    public class Employee {
        private String name;
    
        private Integer age;
        private String dept;
    
        public Employee(String name, Integer age, String dept) {
            this.name = name;
            this.age = age;
            this.dept = dept;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public String getDept() {
            return dept;
        }
    
        public void setDept(String dept) {
            this.dept = dept;
        }
    
        @Override
        public String toString() {
            return "Employee{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", dept='" + dept + '\'' +
                    '}';
        }
    }

    测试类:

    @RunWith(PowerMockRunner.class)
    public class TestUtil
    {
        @Test
        public void test(){
            Employee ee1=new Employee("A",21,"it");
            Employee ee2=new Employee("B",23,"account");
            User user=new User();
            BeanUtil.copyProperties(ee1, user);
            System.out.println(user);
            System.out.println("-------------分割线--------------");
            List<User> output=new ArrayList<>();
            List<Employee> source= Arrays.asList(ee1,ee2);
            output=BeanUtil.convertList2List(source,User.class);
            for (User str:output) {
                System.out.println(str);
            }
        }
    }

    展开全文
  • BeanUtils.copyProperties的使用(深拷贝,浅拷贝)

    万次阅读 多人点赞 2020-03-18 23:30:05
    这里说的是spring的BeanUtils.copyProperties。 场景 开发中经常遇到,把父类的属性拷贝到子类中。通常有2种方法: 1、一个一个set 2、用BeanUtils.copyProperties 很显然BeanUtils更加方便,也美观很多。 那么任何...


    这里说的是spring的BeanUtils.copyProperties。

    场景

    开发中经常遇到,把父类的属性拷贝到子类中。通常有2种方法:
    1、一个一个set
    2、用BeanUtils.copyProperties
    很显然BeanUtils更加方便,也美观很多。
    那么任何情况都能使用BeanUtils么,当然不是。要先了解他。

    BeanUtils是深拷贝,还是浅拷贝?

    是浅拷贝。
    浅拷贝: 只是调用子对象的set方法,并没有将所有属性拷贝。(也就是说,引用的一个内存地址)
    深拷贝: 将子对象的属性也拷贝过去。

    什么情况适合用BeanUtils

    如果都是单一的属性,那么不涉及到深拷贝的问题,适合用BeanUtils。

    有子对象就一定不能用BeanUtils么

    并不绝对,这个要区分考虑:
    1、子对象还要改动。
    2、子对象不怎么改动。
    虽然有子对象,但是子对象并不怎么改动,那么用BeanUtils也是没问题的。

    代码例子

    下面用代码说明下。
    翠山有个儿子无忌,儿子继承了他的face和height。
    但是life应该是自己的。
    后来翠山自刎而死,无忌也变成dead状态了。这就是浅拷贝,无忌用的life引用的翠山的life对象。

    Father类:

    @Data
    public class Father {
        private String face; // 长相
        private String height; // 身高
        private Life life; // 生命
    }
    

    Life 类:

    @Data
    public class Life {
        private String status;
    }
    

    Son类和main方法:

    @Data
    public class Son extends Father{
        private Life life;
    
        public static void main(String[] args) {
            Father cuishan = new Father();
            cuishan.setFace("handsome");
            cuishan.setHeight("180");
            Life cuishanLife = new Life();
            cuishanLife.setStatus("alive");
            cuishan.setLife(cuishanLife);
            Son wuji=new Son();
            BeanUtils.copyProperties(cuishan,wuji);
    
    //        Life wujiLife = wuji.getLife();
    //        wujiLife.setStatus("alive");
    //        wuji.setLife(wujiLife);
    //        cuishanLife.setStatus("dead"); // 翠山后来自刎了
    
            System.out.println(JSON.toJSONString(cuishan));
            System.out.println(JSON.toJSONString(wuji));
        }
    }
    

    上面注释出的代码可以如下替换:
    case1和case2还是受浅拷贝的影响,case3不受。
    case1: 翠山自刎,无忌也挂了

    //        Life wujiLife = wuji.getLife();
    //        wujiLife.setStatus("alive");
    //        wuji.setLife(wujiLife);
    //        cuishanLife.setStatus("dead"); // 翠山后来自刎了
    

    case2: 翠山自刎,无忌设置或者,翠山也活了

    //        cuishanLife.setStatus("dead"); // 翠山后来自刎了
    //        Life wujiLife = wuji.getLife();
    //        wujiLife.setStatus("alive");
    //        wuji.setLife(wujiLife);
    

    case3: 翠山和无忌互不影响

    		cuishanLife.setStatus("dead"); // 翠山自刎了  该行放在上下均可
            // 无忌用个新对象 不受翠山影响了
            Life wujiLife = new Life();
            wujiLife.setStatus("alive");
            wuji.setLife(wujiLife);
    

    dest ,src 还是 src,dest

    笔者在这个爬过坑。
    因为记得有beanutils这个工具,直接import了。
    发现有copyProperty和copyProperties。 看了下发现是 dest,src ,于是果断使用,结果发现参数没了。

    其实常见的BeanUtils有2个:
    spring有BeanUtils
    apache的commons也有BeanUtils。

    区别如下:

    spring的BeanUtilscommons的BeanUtils
    方法copyProperty和copyPropertiescopyProperties
    参数src ,destdest,src

    这2个用哪个都行,但是要注意区别。 因为他们2个的src和dest是正好相反的,要特别留意。

    展开全文
  • BeanUtils.copyProperties忽略null值/只拷贝非null属性

    万次阅读 多人点赞 2018-09-24 00:52:12
    那么用其他方式实现很麻烦,本身的BeanUtils.copyProperties也是不大支持。 解决方案 hutool开源库为我们提供了更为强大的Bean工具-BeanUtil,只需要一句代码就搞定BeanUtil.copyProperties(oldDetail.get(),...

    问题场景

    例如有个对象要提交,提交一次,第二次提交我们希望是对上次提交的完善。。那么用其他方式实现很麻烦,本身的BeanUtils.copyProperties也是不大支持。

    2020-12-19更新 新增了更好用的BeanMerge方法,可以直接完整的copy对象属性,把两个属性合成到一个上面,详情请参考 《比BeanCopy好用的BeanMerge(java合并对象属性,把非空属性合成到目标对象上)》

    解决方案

    hutool开源库为我们提供了更为强大的Bean工具-BeanUtil,

    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>4.1.14</version>
    </dependency>
    

    以上问题,只需要一句代码就搞定!!!

    BeanUtil.copyProperties(oldDetail.get(),userDetail,true, CopyOptions.create().setIgnoreNullValue(true).setIgnoreError(true));

    核心代码是CopyOptions.create().setIgnoreNullValue(true).setIgnoreError(true)

    详情可以参考官方文档 http://hutool.mydoc.io/#text_319433 。

    更详细的业务场景如下:

    public Object save(UserDetail userDetail){
            if(userDetail.getUserId()==0){
                return ApiReturnUtil.error("userId不能为空");
            }else{
            	//复制一个新的用于保存
             	UserDetail newDetail=new UserDetail();
                BeanUtil.copyProperties(userDetail,newDetail);
                Optional<UserDetail> oldDetail=userDetailRepository.findById(userDetail.getUserId());
                if (oldDetail.isPresent()){
                    System.out.println("copying");
                    //复制旧的属性过来,忽略null属性,忽略null值,有值的以新的为主,null的则以旧为主
                    BeanUtil.copyProperties(oldDetail.get(),userDetail,true, CopyOptions.create().setIgnoreNullValue(true).setIgnoreError(true));
                }
                //复制新的所有非null来覆盖旧的
                BeanUtil.copyProperties(userDetail,newDetail,true, CopyOptions.create().setIgnoreNullValue(true).setIgnoreError(true));
    
                userDetailRepository.save(newDetail);
                return  ApiReturnUtil.success("保存成功",newDetail);
            }
        }
    

    CopyOptions配置项:

    CopyOptions参数提供一些BeanUtils.copyProperties注入属性的选项。

    使用方法如下:
    BeanUtil.copyProperties(oldObject,newObject,true, CopyOptions.create().setXXXX(true));

    • editable 限制的类或接口,必须为目标对象的实现接口或父类,用于限制拷贝的属性,例如一个类我只想复制其父类的一些属性,就可以将editable设置为父类。
    • ignoreNullValue 是否忽略空值,当源对象的值为null时,true: 忽略而不注入此值,false: 注入null
    • ignoreProperties 忽略的属性列表,设置一个属性列表,不拷贝这些属性值
    • ignoreError 是否忽略字段注入错误
      可以通过CopyOptions.create()方法创建一个默认的配置项,通过setXXX方法设置每个配置项。
    展开全文
  • 主要介绍了java Beanutils.copyProperties( )用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • beanutils.copyproperties

    千次阅读 2018-08-08 17:14:27
    背景: 在电商项目中所需要的业务非常多,...后来用了一下BeanUtils.copyPropertie,和PropertyUtils.copyProperties()的方法,发现其效率非常低。这里也简单总结了一下他们的用法及原理以及自己实现的转换类; ...
  • 主要介绍了使用BeanUtils.copyProperties进行对象之间的属性赋值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • BeanUtils.copyProperties 详解

    万次阅读 2021-04-27 14:46:08
    简介 BeanUtils 提供对 Java 反射和自省 API 的包装,其主要目的是...BeanUtils 是这个包里比较常用的一个工具类,这里只介绍它的 copyProperties() 方法,该方法定义如下: public static void copyProperties(Object
  • 源码解析BeanUtils.copyProperties方法

    千次阅读 2020-01-20 16:09:06
    常用的 BeanUtils.copyProperties 方法,你知道它的实现原理吗?
  • (2):BeanUtils.copyProperties(class1,class2);// 此方式效率极慢,spring的copyproties稍可接受,get,set几乎1ms 第一种方法,如果复制的类继承了父类,父类的ID属性是泛型并且序列化了会导致复制失败(详情可以...
  • 一个BeanUtils.copyProperties的小型快速替代。 起因 由于BeanUtils(Spring或Apache Commons)的copyProperties实现是利用反射实现的,它在大量调用时具有比较严重的性能问题。 BeanMapper通过javassist类库实现在...
  • BeanUtils.copyProperties 属性复制List的坑

    万次阅读 2018-11-15 21:34:42
    BeanUtils.copyProperties 大家都知道是用来作为属性复制的工具,最近在项目遇到了一个坑 class A{ private String name; private List&lt;Cat&gt; cats; private String age; } class Cat{ private ...
  • Beanutils.copyProperties的异常问题Beanutils.copyProperties有两种异常源码跟踪源码分析 Beanutils.copyProperties有两种异常 Beanutils.copyProperties 异常一: No origin bean specified Beanutils....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,278
精华内容 5,311
关键字:

beanutils.copyproperties