beanutils,beanutilscopyproperties忽略null

http://www.itjxue.com  2023-01-20 00:53  来源:未知  点击次数: 

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包已经添加成功,如下图:

(责任编辑:IT教学网)

更多

相关时间特效文章

推荐时间特效文章