beanutils,beanutilscopyproperties忽略null
java BeanUtils读取Date时报错
从提示看,没有使用你自定义的Converter,另外查看一下你的Date,在转换器里你定义的是java.sql.Date,你的Bean里是什么类型的Date?因为还有一个util.Date
如何利用 beanutils.copyproperties;更新部分
spring和apache commons-beanutils中分别存在一个BeanUtils,提供了对java bean的常用操作。
之前在写程序时,用到了两个不同类型但属性基本相同的对象的拷贝,结果在拷贝java.util.Date类型的对象属性时,由于其值为null,而抛异常。
由于时间紧急,所以临时改成了get/set方式,幸亏对象的属性不算多。
后来一直耿耿于怀这个问题,今天抽空看了一下spring和apache commons-beanutils包中BeanUtils.copyProperties的实现。
spring中实现的方式很简单,就是对两个对象中相同名字的属性进行简单get/set,仅检查属性的可访问性。
而commons-beanutils则施加了很多的检验,包括类型的转换,甚至于还会检验对象所属的类的可访问性。
而且,commons-beanutils中的装换是不支持java.util.Date的。除了支持基本类型以及基本类型的数组之外,还支持java.sql.Date, java.sql.Time, java.sql.TimeStamp, java.io.File, javaio.URL这些类的对象,其余一概不支持。不过你可以自定义你的类的Converter。然后注册进去。
感觉commons-beanutils包中的这个BeanUtils类的copyProperties方法,太过复杂,约束太多,而且使用不便,虽然可扩展性好了,但是易用性不高。
总结:
关于bean复制,如果属性较少,建议直接写个方法完成get/set即可。如果属性较多,可以自己采用反射实现一个满足自己需要的工具类,或者使用spring的那个beanutils类,不建议使用commons-beanutils包中的那个BeanUtils类,刚看了下,这个类对于内部静态类的对象复制也会出现问题,检验太复杂了,常会出现一些诡异的问题。毕竟我们bean复制一般就是简单的属性copy而已。
而且,由于这些BeanUtils类都是采用反射机制实现的,对程序的效率也会有影响。因此,慎用BeanUtils.copyProperties!!!
BeanUtils 踩坑知识
开发中有一步要发送 http 请求,参数为 map ,原本是有一个 bean 的, 于是就需要转换一下,
spring springframework 里有 BeanUtils,包含一个广为人知的 copyProperties 方法,于是点开这个类看了并没有转为map的,
虽然写一个转换方法也不算困难,不过由于时间关系,如果有现成的就直接导包用嘛,
然后搜索了一下,发现 org.apache.commons.beanutils.BeanUtils 有一个 populate(bean, map),的方法,就拿过来用了,
后来测试时候发现map是空的,就很懵逼,然后看了一下方法描述
@param properties Map keyed by property name, with the corresponding (String or String[]) value(s) to be set
就是说先要把 bean 的属性设为 map 的 key 才行,有 key 才会有值,而 new 的 map 当然是空的,结果还是空的。(⊙﹏⊙) 想不通开发者这么做的用意。
无奈正打算重写之际,发现它的第一个方法(因为是d开头)describe 参数为 bean ,return map,跑了一下测试打印出来是这样子的
{ CSNF=null, CDBH=ererger, class=class com.dto.PeopleData}
多一个 class 属性,然后 map.remove("class") ,就得到了想要的结果
{ CSNF=null, CDBH=ererger}
下面是得空补上的手动实现方法
怎么把beanutils 包导入?
看到你的截图了,?org.apache.commons.beanutils.PropertyUtilsBean.getMappedProperty这个方法, 需要使用 一个名叫?org.apache.commons.collections.FastHashMap 的类
这个类是?commons-collections jar里面的
我看了下?commons-beanutils 的依赖关系
也就是说 你还需要 导入?commons-logging 以及?commons-collections 这两个包
android-studio中怎么添加beanutils
将beanutils的jar包加入到libs文件夹中,然后右键选择Add As library进行编译,编译之后即添加成功,课直接使用,添加步骤如下:
1、把beanutils的jar包,复制到app--libs文件夹下(不能展开的就是不能使用,表示没有添加成功),如下图:
2、在jar包下右键鼠标,选择Add as Library,如下图:
3、等待系统编译完成,jar包可以展开表示jar包已经添加成功,如下图: