有关apache包里面的BeanUtils.copyProperties 字段类型为Integer或者Double时,自动赋值为默认值的问题随笔

当使用BeanUtils.copyProperties方法时,若目标对象中存在类型为Double且值为null的字段,该字段会被默认赋值为0.0,这可能影响业务逻辑。本文介绍如何使用ConvertUtils.register方法来解决此问题。

BeanUtils.copyProperties(A,B);
如果数据源B对象里面的某一个类型为Double的字段是null,那么通过Apache的这个方法copy过来,那么A对象里面的对应字段就会默认为0.0
这就然我们很反感,有可能涉及到我们自己的业务逻辑之后的改变。

我们可以采用ConvertUtils.register() 来解决这个问题。具体代码如下:
ConvertUtils.register(new DoubleConverter(null), Double.class);
ConvertUtils.register(new IntegerConverter(null), Integer.class);
ConvertUtils.register(new DateConverter(null), java.util.Date.class);
BeanUtils.copyProperties(jq_cp, productBean);

这里的ConverUtils,DoubleConverter,IntegerConverter,DateConverter 都用的apache.commons 里面的包。

解决 `BeanUtils.copyProperties` 方法将 `null` 字段覆盖目标对象的方案有以下几种: ### 忽略特定字段 使用 `BeanUtils.copyProperties` 添加可变长参数来忽略具体不需要更新的字段。例如 `BeanUtils.copyProperties(newdata, dbdata, "id", "password")`,这样 `id` 和 `password` 字段就不会被覆盖 [^1]。 ### 自定义方法忽略 `null` 字段 可以自定义一个方法,在复制属性判断目标对象的字段是否为 `null`,仅复制目标对象中为 `null` 的属性。示例代码如下: ```java import java.lang.reflect.Field; public class BeanUtilsCustom { public static void copyProperties(Object source, Object target) throws IllegalAccessException { // 获取源对象的所有字段 Field[] sourceFields = source.getClass().getDeclaredFields(); // 获取目标对象的所有字段 Field[] targetFields = target.getClass().getDeclaredFields(); // 遍历 for (int i = 0; i < sourceFields.length; i++) { for (int j = 0; j < targetFields.length; j++) { // 根据字段名称去匹配,有相同的字段名称进行复制值 if (sourceFields[i].getName().equals(targetFields[j].getName())) { // 开启权限 sourceFields[i].setAccessible(true); targetFields[j].setAccessible(true); // 判断目标对象里面的字段为 null if (targetFields[j].get(target) == null) { // 给目标对象字段赋值 targetFields[j].set(target, sourceFields[i].get(source)); // 赋值后跳出当前循环 } // 关闭权限 sourceFields[i].setAccessible(false); targetFields[j].setAccessible(false); } } } } } ``` 要注意的是,源对象和目标对象的字段名称要一致 [^4]。 ### 结合自定义方法调用 可以调用如下两个方法,通过自定义方法获取源对象中 `null` 属性的名称,在 `copyProperties` 忽略这些属性: ```java // 方法一 BeanUtils.copyProperties(dto, entity); // 方法二 BeanUtils.copyProperties(dto, entity, getNullPropertyNames(dto)); ``` 不过这里需要实现 `getNullPropertyNames` 方法来获取 `null` 属性的名称 [^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值