From 9be0fef520cae7ea9958d16ebc444baf67f01082 Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 22 Aug 2024 12:05:24 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DCopyOptions.setFieldValueEdit?= =?UTF-8?q?or=E5=90=8E=E7=94=9F=E6=88=90null=E5=80=BCsetIgnoreNullValue?= =?UTF-8?q?=E6=97=A0=E6=95=88=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 3 +- .../core/bean/copier/BeanToMapCopier.java | 4 +- .../core/bean/copier/MapToBeanCopier.java | 2 +- .../core/bean/copier/MapToMapCopier.java | 13 +++--- .../copier/ValueProviderToBeanCopier.java | 2 + .../cn/hutool/core/bean/Issue3702Test.java | 41 +++++++++++++++++++ 6 files changed, 57 insertions(+), 8 deletions(-) create mode 100644 hutool-core/src/test/java/cn/hutool/core/bean/Issue3702Test.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 22d6a69e7..5c78979ca 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ # 🚀Changelog ------------------------------------------------------------------------------------------------------------- -# 5.8.32(2024-08-15) +# 5.8.32(2024-08-22) ### 🐣新特性 @@ -10,6 +10,7 @@ * 【http 】 修复getFileNameFromDisposition不符合规范问题(issue#IAKBPD@Gitee) * 【crypto 】 修复SymmetricCrypto.setParams和setRandom没有加锁问题(issue#IAJIY3@Gitee) * 【crypto 】 修复ZipUtil压缩成流的方法检查文件时报错问题(issue#3697@Github) +* 【core 】 修复CopyOptions.setFieldValueEditor后生成null值setIgnoreNullValue无效问题(issue#3702@Github) ------------------------------------------------------------------------------------------------------------- # 5.8.31(2024-08-12) diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/copier/BeanToMapCopier.java b/hutool-core/src/main/java/cn/hutool/core/bean/copier/BeanToMapCopier.java index 1809db340..0499a70f3 100755 --- a/hutool-core/src/main/java/cn/hutool/core/bean/copier/BeanToMapCopier.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/copier/BeanToMapCopier.java @@ -73,9 +73,11 @@ public class BeanToMapCopier extends AbsCopier { if(null != typeArguments && typeArguments.length > 1){ //sValue = Convert.convertWithCheck(typeArguments[1], sValue, null, this.copyOptions.ignoreError); sValue = this.copyOptions.convertField(typeArguments[1], sValue); - sValue = copyOptions.editFieldValue(sFieldName, sValue); } + // 自定义值 + sValue = copyOptions.editFieldValue(sFieldName, sValue); + // 目标赋值 if(null != sValue || false == copyOptions.ignoreNullValue){ //noinspection unchecked diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/copier/MapToBeanCopier.java b/hutool-core/src/main/java/cn/hutool/core/bean/copier/MapToBeanCopier.java index 7f0a98234..ef12c0adb 100755 --- a/hutool-core/src/main/java/cn/hutool/core/bean/copier/MapToBeanCopier.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/copier/MapToBeanCopier.java @@ -5,7 +5,6 @@ import cn.hutool.core.bean.PropDesc; import cn.hutool.core.lang.Assert; import cn.hutool.core.map.CaseInsensitiveMap; import cn.hutool.core.map.MapWrapper; -import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.TypeUtil; import java.lang.reflect.Type; @@ -89,6 +88,7 @@ public class MapToBeanCopier extends AbsCopier, T> { final Type fieldType = TypeUtil.getActualType(this.targetType, tDesc.getFieldType()); //Object newValue = Convert.convertWithCheck(fieldType, sValue, null, this.copyOptions.ignoreError); Object newValue = this.copyOptions.convertField(fieldType, sValue); + // 自定义值 newValue = copyOptions.editFieldValue(sKeyStr, newValue); // 目标赋值 diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/copier/MapToMapCopier.java b/hutool-core/src/main/java/cn/hutool/core/bean/copier/MapToMapCopier.java index ca443c608..500ddd73d 100755 --- a/hutool-core/src/main/java/cn/hutool/core/bean/copier/MapToMapCopier.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/copier/MapToMapCopier.java @@ -37,10 +37,6 @@ public class MapToMapCopier extends AbsCopier { if (null == sKey) { return; } - // 忽略空值 - if (true == copyOptions.ignoreNullValue && sValue == null) { - return; - } if(sKey instanceof String){ sKey = copyOptions.editFieldName((String) sKey); @@ -66,7 +62,14 @@ public class MapToMapCopier extends AbsCopier { if (null != typeArguments) { //sValue = Convert.convertWithCheck(typeArguments[1], sValue, null, this.copyOptions.ignoreError); sValue = this.copyOptions.convertField(typeArguments[1], sValue); - sValue = copyOptions.editFieldValue(sKey.toString(), sValue); + } + + // 自定义值 + sValue = copyOptions.editFieldValue(sKey.toString(), sValue); + + // 忽略空值 + if (true == copyOptions.ignoreNullValue && sValue == null) { + return; } // 目标赋值 diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/copier/ValueProviderToBeanCopier.java b/hutool-core/src/main/java/cn/hutool/core/bean/copier/ValueProviderToBeanCopier.java index cef5ccf0c..952923a51 100755 --- a/hutool-core/src/main/java/cn/hutool/core/bean/copier/ValueProviderToBeanCopier.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/copier/ValueProviderToBeanCopier.java @@ -79,6 +79,8 @@ public class ValueProviderToBeanCopier extends AbsCopier map= new HashMap<>(); + map.put("a",""); + map.put("b","b"); + map.put("c","c"); + map.put("d","d"); + + Map map2= new HashMap<>(); + map2.put("a","a1"); + map2.put("b","b1"); + map2.put("c","c1"); + map2.put("d","d1"); + + CopyOptions option= CopyOptions.create() + .setIgnoreNullValue(true) + .setIgnoreError(true) + .setFieldValueEditor((name, value)->{ + if(value.equals("")){ + value=null; + } + return value; + }); + BeanUtil.copyProperties(map,map2,option); + Assertions.assertEquals("{a=a1, b=b, c=c, d=d}", map2.toString()); + System.out.println(map2); + } +}