From b5619fefbdae66761086a92fb89d56a01f513c1b Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 20 May 2022 11:33:56 +0800 Subject: [PATCH] add null check --- .../java/cn/hutool/core/bean/BeanUtil.java | 6 ++++ .../hutool/core/bean/copier/BeanCopier.java | 28 ++++++++++--------- .../core/bean/copier/MapToMapCopier.java | 2 +- .../cn/hutool/core/bean/BeanUtilTest.java | 5 ++++ 4 files changed, 27 insertions(+), 14 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java index 29bc44616..2b8997dae 100755 --- a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java @@ -685,6 +685,9 @@ public class BeanUtil { * @return 目标对象 */ public static T copyProperties(final Object source, final Class tClass, final String... ignoreProperties) { + if(null == source){ + return null; + } final T target = ConstructorUtil.newInstanceIfPossible(tClass); copyProperties(source, target, CopyOptions.create().setIgnoreProperties(ignoreProperties)); return target; @@ -722,6 +725,9 @@ public class BeanUtil { * @param copyOptions 拷贝选项,见 {@link CopyOptions} */ public static void copyProperties(final Object source, final Object target, final CopyOptions copyOptions) { + if(null == source || null == target){ + return; + } BeanCopier.create(source, target, ObjUtil.defaultIfNull(copyOptions, CopyOptions::create)).copy(); } diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/copier/BeanCopier.java b/hutool-core/src/main/java/cn/hutool/core/bean/copier/BeanCopier.java index 162754eb7..35716d990 100755 --- a/hutool-core/src/main/java/cn/hutool/core/bean/copier/BeanCopier.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/copier/BeanCopier.java @@ -1,5 +1,6 @@ package cn.hutool.core.bean.copier; +import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.copier.Copier; import java.io.Serializable; @@ -16,9 +17,8 @@ import java.util.Map; * 4. Map 转 Map * * - * @author looly - * * @param 目标对象类型 + * @author looly * @since 3.2.3 */ public class BeanCopier implements Copier, Serializable { @@ -29,9 +29,9 @@ public class BeanCopier implements Copier, Serializable { /** * 创建BeanCopier * - * @param 目标Bean类型 - * @param source 来源对象,可以是Bean或者Map - * @param target 目标Bean对象 + * @param 目标Bean类型 + * @param source 来源对象,可以是Bean或者Map + * @param target 目标Bean对象 * @param copyOptions 拷贝属性选项 * @return BeanCopier */ @@ -42,10 +42,10 @@ public class BeanCopier implements Copier, Serializable { /** * 创建BeanCopier * - * @param 目标Bean类型 - * @param source 来源对象,可以是Bean或者Map - * @param target 目标Bean对象 - * @param destType 目标的泛型类型,用于标注有泛型参数的Bean对象 + * @param 目标Bean类型 + * @param source 来源对象,可以是Bean或者Map + * @param target 目标Bean对象 + * @param destType 目标的泛型类型,用于标注有泛型参数的Bean对象 * @param copyOptions 拷贝属性选项 * @return BeanCopier */ @@ -56,13 +56,15 @@ public class BeanCopier implements Copier, Serializable { /** * 构造 * - * @param source 来源对象,可以是Bean或者Map - * @param target 目标Bean对象 - * @param targetType 目标的泛型类型,用于标注有泛型参数的Bean对象 + * @param source 来源对象,可以是Bean或者Map,不能为{@code null} + * @param target 目标Bean对象,不能为{@code null} + * @param targetType 目标的泛型类型,用于标注有泛型参数的Bean对象 * @param copyOptions 拷贝属性选项 */ @SuppressWarnings("unchecked") public BeanCopier(final Object source, final T target, final Type targetType, final CopyOptions copyOptions) { + Assert.notNull(source, "Source bean must be not null!"); + Assert.notNull(target, "Target bean must be not null!"); final Copier copier; if (source instanceof Map) { if (target instanceof Map) { @@ -70,7 +72,7 @@ public class BeanCopier implements Copier, Serializable { } else { copier = new MapToBeanCopier<>((Map) source, target, targetType, copyOptions); } - }else if(source instanceof ValueProvider){ + } else if (source instanceof ValueProvider) { //noinspection unchecked copier = new ValueProviderToBeanCopier<>((ValueProvider) source, target, targetType, copyOptions); } else { 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 c3dee2e92..a9cb20944 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 @@ -24,7 +24,7 @@ public class MapToMapCopier extends AbsCopier { * @param source 来源Map * @param target 目标Bean对象 * @param targetType 目标泛型类型 - * @param copyOptions 拷贝选项 + * @param copyOptions 拷贝选项,{@code null}使用默认配置 */ public MapToMapCopier(final Map source, final Map target, final Type targetType, final CopyOptions copyOptions) { super(source, target, copyOptions); diff --git a/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java index 8ada196b7..09cc8277f 100755 --- a/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java @@ -567,6 +567,11 @@ public class BeanUtilTest { Assert.assertNull(newFood.getCode()); } + @Test + public void copyNullTest() { + Assert.assertNull(BeanUtil.copyProperties(null, Food.class)); + } + @Test public void copyBeanPropertiesFilterTest() { final Food info = new Food();