From fc186ddd54751c93dc4a24fc457e802491800366 Mon Sep 17 00:00:00 2001 From: topgun Date: Mon, 31 Oct 2022 22:24:34 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20BeanUtil#copyProper?= =?UTF-8?q?ties=20=E6=BA=90=E5=AF=B9=E8=B1=A1=E4=B8=8E=E7=9B=AE=E6=A0=87?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1=E9=83=BD=E6=98=AF=20Map=20=E6=97=B6=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E5=BF=BD=E7=95=A5=E5=B1=9E=E6=80=A7=E6=97=A0=E6=95=88?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit closes #2697 --- .../hutool/core/bean/copier/CopyOptions.java | 28 +++++++++++++++++++ .../core/bean/copier/MapToMapCopier.java | 6 ++++ .../cn/hutool/core/bean/Issue2697Test.java | 24 ++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 hutool-core/src/test/java/cn/hutool/core/bean/Issue2697Test.java diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/copier/CopyOptions.java b/hutool-core/src/main/java/cn/hutool/core/bean/copier/CopyOptions.java index d083b5f43..d904c13d8 100755 --- a/hutool-core/src/main/java/cn/hutool/core/bean/copier/CopyOptions.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/copier/CopyOptions.java @@ -12,6 +12,8 @@ import cn.hutool.core.util.ReflectUtil; import java.io.Serializable; import java.lang.reflect.Field; import java.lang.reflect.Type; +import java.util.Arrays; +import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.function.BiFunction; @@ -69,6 +71,11 @@ public class CopyOptions implements Serializable { */ protected boolean override = true; + /** + * 源对象和目标对象都是 {@code Map} 时, 需要忽略的源对象 {@code Map} key + */ + private Set ignoreKeySet; + /** * 自定义类型转换器,默认使用全局万能转换器转换 */ @@ -181,6 +188,7 @@ public class CopyOptions implements Serializable { * @return CopyOptions */ public CopyOptions setIgnoreProperties(String... ignoreProperties) { + this.setIgnoreKeySet(ignoreProperties); return setPropertiesFilter((field, o) -> false == ArrayUtil.contains(ignoreProperties, field.getName())); } @@ -220,6 +228,16 @@ public class CopyOptions implements Serializable { return setIgnoreError(true); } + /** + * 设置忽略源 {@link Map} key set + * @param ignoreProperties 忽略的key + * @return CopyOptions + */ + public CopyOptions setIgnoreKeySet(String... ignoreProperties) { + this.ignoreKeySet = new HashSet<>(Arrays.asList(ignoreProperties)); + return this; + } + /** * 设置是否忽略字段的大小写 * @@ -363,4 +381,14 @@ public class CopyOptions implements Serializable { protected boolean testPropertyFilter(Field field, Object value) { return null == this.propertiesFilter || this.propertiesFilter.test(field, value); } + + /** + * 测试是否保留key, {@code true} 不保留, {@code false} 保留 + * + * @param key {@link Map} key + * @return 是否保留 + */ + protected boolean testMapKeyFilter(Object key) { + return this.ignoreKeySet.contains(key); + } } 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 9b431d189..b12d49ab6 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 @@ -54,6 +54,12 @@ public class MapToMapCopier extends AbsCopier { return; } + // 忽略不需要拷贝的 key, + if (true == copyOptions.testMapKeyFilter(sKey)) { + return; + } + + // 获取目标值真实类型并转换源值 final Type[] typeArguments = TypeUtil.getTypeArguments(this.targetType); if (null != typeArguments) { diff --git a/hutool-core/src/test/java/cn/hutool/core/bean/Issue2697Test.java b/hutool-core/src/test/java/cn/hutool/core/bean/Issue2697Test.java new file mode 100644 index 000000000..4b6667ae1 --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/bean/Issue2697Test.java @@ -0,0 +1,24 @@ +package cn.hutool.core.bean; + + +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + +/** + * https://github.com/dromara/hutool/issues/2697 + */ +public class Issue2697Test { + + @Test + public void mapToMapTest(){ + Map mapA = new HashMap<>(16); + mapA.put("12", "21"); + mapA.put("121", "21"); + mapA.put("122", "21"); + Map mapB = new HashMap<>(16); + BeanUtil.copyProperties(mapA, mapB, "12"); + System.out.println(mapB); + } +}