BeanUtils.copyProperties方法,当属性Date类型为null的解决 方法

By | 2023年1月11日

问题描述

利用org.apache.commons.beanutils工具进行属性拷贝,例如有如下场景

user对象和formBean对象都有属性birthday,而且都是java.sql.Date类型的。
当利用BeanUtils.copyProperties(user,formBean)复制属性时候,formBean中属性birthday为null,那么就会出现如下异常

解决方法

BeanUtils.copyProperties(user,formBean);前加上一行代码:

BeanUtilsBean.getInstance().getConvertUtils().register(new SqlDateConverter(null),java.sql.Date.class);

也就是注册一个SqlDateConverter转换器,defaultValue=null,这样就可以接受null值。

原因分析

从源码的copyProperty方法可以看出,只有找到注册过的转化器,才使用转化器进行对值的转化,否则直接copy value。而deregister中并没有对java.util.Date注册相应的转化器,所以可以通过注册相对应的转化器来解决,或者把java.sql.Date改为java.util.Date也可以解决问题。