欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

BeanUtilsBean对象复制使用(类型可以自动转化)

程序员文章站 2022-05-02 09:49:25
...

BeanUtilsBean一般这种没有这种严格,类型可以自动转化,只要名字一样即可,PropertyUtils.copyProperties名字一样,类型一样才能转过 

以及一些特殊类型处理,和特殊选择性复制的处理

 

BeanUtils.copyProperties VS PropertyUtils.copyProperties 

两者最大的区别是: 
BeanUtils.copyProperties会进行类型转换,而PropertyUtils.copyProperties不会。 
既然进行了类型转换,那BeanUtils.copyProperties的速度比不上PropertyUtils.copyProperties。 

因此,PropertyUtils.copyProperties应用的范围稍为窄一点,它只对名字和类型都一样的属性进行copy,如果名字一样但类型不一样,它会报错。 

 

 复制不成功的原因:get set方法不一样 大小写不一样 ,属性名不一样,或者get,set方法不一样都会复制不了,最好属性类型一样

(从源码看出两方分别要检查可以写,可读,这个时候就要属性以及get,set一


关于两者区别,http://caoyaojun1988-163-com.iteye.com/blog/1871316这篇文章总结了很多。 

下面主要谈谈BeanUtils。 

使用BeanUtils有几个要注意的地方:
 
1.对于类型为Boolean/Short/Integer/Float/Double的属性,它会转换为0: 

Java代码  BeanUtilsBean对象复制使用(类型可以自动转化)
            
    
    博客分类: BeanUtils BeanUtils 
  1. public class User {  
  2.   
  3.     private Integer intVal;  
  4.       
  5.     private Double doubleVal;  
  6.       
  7.     private Short shortVal;  
  8.       
  9.     private Long longVal;  
  10.       
  11.     private Float floatVal;  
  12.       
  13.     private Byte byteVal;  
  14.       
  15.     private Boolean booleanVal;  
  16. }  
  17.   
  18. User src = new User();  
  19. User dest = new User();  
  20. BeanUtils.copyProperties(dest, src);  
  21. System.out.println(src);  
  22. System.out.println(dest);  
  23.   
  24. //输出      
  25. User [intVal=null, doubleVal=null, shortVal=null, longVal=null, floatVal=null, byteVal=null, booleanVal=null]  
  26. User [intVal=0, doubleVal=0.0, shortVal=0, longVal=0, floatVal=0.0, byteVal=0, booleanVal=false]  


在*上有人解释说是因为这几个类型都有对应的基本类型,在进行类型转换时,有可能遇到类似Integer -> int的转换,此时显然不能对int类型的属性赋值为null,因此统一转换为0。 

如何让它不要转为0呢?可以这样: 

Java代码  BeanUtilsBean对象复制使用(类型可以自动转化)
            
    
    博客分类: BeanUtils BeanUtils 
  1. import org.apache.commons.beanutils.converters.IntegerConverter;  
  2.   
  3. IntegerConverter converter = new IntegerConverter(null);    //默认为null,而不是0  
  4. BeanUtilsBean beanUtilsBean = new BeanUtilsBean();  
  5. beanUtilsBean.getConvertUtils().register(converter, Integer.class);  


2.对于java.util.Date/BigDecimal/java.sql.Date/java.sql.Timestamp/java.sql.Time这几个类,如果值为null,则在copy时会抛异常,需要使用对应的Conveter: 

Java代码  BeanUtilsBean对象复制使用(类型可以自动转化)
            
    
    博客分类: BeanUtils BeanUtils 
  1. public class User2 {  
  2.   
  3.     private java.util.Date javaUtilDateVal;  
  4.       
  5.     private java.sql.Date javaSqlDateVal;  
  6.       
  7.     private java.sql.Timestamp javaSqlTimeStampVal;  
  8.       
  9.     private BigDecimal bigDecimalVal;  
  10.   
  11.     private java.sql.Time javaSqlTime;  
  12.   
  13. }  
  14.   
  15. User2 src = new User2();  
  16. User2 dest = new User2();  
  17.   
  18. BeanUtilsBean beanUtilsBean = new BeanUtilsBean();  
  19.   
  20. //如果没有下面几行,则在转换null时会抛异常,例如:org.apache.commons.beanutils.ConversionException: No value specified for 'BigDecimal'  
  21. //在org.apache.commons.beanutils.converters这个包下面有很多的Converter,可以按需要使用  
  22. beanUtilsBean.getConvertUtils().register(new org.apache.commons.beanutils.converters.BigDecimalConverter(null), BigDecimal.class);  
  23. beanUtilsBean.getConvertUtils().register(new org.apache.commons.beanutils.converters.DateConverter(null), java.util.Date.class);  
  24.   
  25. beanUtilsBean.getConvertUtils().register(new org.apache.commons.beanutils.converters.SqlTimestampConverter(null), java.sql.Timestamp.class);  
  26. beanUtilsBean.getConvertUtils().register(new org.apache.commons.beanutils.converters.SqlDateConverter(null), java.sql.Date.class);  
  27. beanUtilsBean.getConvertUtils().register(new org.apache.commons.beanutils.converters.SqlTimeConverter(null), java.sql.Time.class);  
  28.   
  29. beanUtilsBean.copyProperties(dest, src);  
  30. System.out.println(src);  
  31. System.out.println(dest);  



使用BeanUtils还会经常碰到这样变态的需求: 
假设是从A复制到B: 
需求1:如果B中某字段有值(不为null),则该字段不复制;也就是B中该字段没值时,才进行复制,适合于对B进行补充值的情况。 
需求2:如果A中某字段没值(为null),则该字段不复制,也就是不要把null复制到B当中。 

对于需求1,可以这样: 

Java代码  BeanUtilsBean对象复制使用(类型可以自动转化)
            
    
    博客分类: BeanUtils BeanUtils 
  1. import org.apache.commons.beanutils.BeanUtilsBean;  
  2. import org.apache.commons.beanutils.PropertyUtils;  
  3.   
  4. public class CopyWhenNullBeanUtilsBean extends BeanUtilsBean{  
  5.   
  6.     @Override  
  7.     public void copyProperty(Object bean, String name, Object value)  
  8.             throws IllegalAccessException, InvocationTargetException {  
  9.         try {  
  10.             Object destValue = PropertyUtils.getSimpleProperty(bean, name);  
  11.             if (destValue == null) {  
  12.                 super.copyProperty(bean, name, value);  
  13.             }  
  14.         } catch (NoSuchMethodException e) {  
  15.             throw new RuntimeException(e);  
  16.         }  
  17.     }  
  18.   
  19. }  


对于需求2,可以这样: 

Java代码  BeanUtilsBean对象复制使用(类型可以自动转化)
            
    
    博客分类: BeanUtils BeanUtils 
  1. import org.apache.commons.beanutils.BeanUtilsBean;  
  2.   
  3. public class CopyFromNotNullBeanUtilsBean extends BeanUtilsBean {  
  4.   
  5.     @Override  
  6.     public void copyProperty(Object bean, String name, Object value) throws IllegalAccessException, InvocationTargetException {  
  7.         if (value == null) {  
  8.             return;  
  9.         }  
  10.         super.copyProperty(bean, name, value);  
  11.     }  
  12. }  

 

 

list类型的复制:

 

 

BeanUtilsCopy.copyList(weixinBaseInfo, weixinBaseInfoDOs, WeixinBaseInfo.class);

 

 

 

相关标签: BeanUtils