From 1c4c69cfe840302a00237bf9caec5e80ee6a91f4 Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 19 Aug 2020 18:03:14 +0800 Subject: [PATCH] fix bean --- CHANGELOG.md | 4 +- bin/package.sh | 3 ++ .../hutool/core/bean/copier/BeanCopier.java | 11 +---- .../java/cn/hutool/core/util/ArrayUtil.java | 17 +++++++- .../java/cn/hutool/core/util/StrUtil.java | 41 +++++++++++++++++++ .../cn/hutool/core/util/CharUtilTest.java | 12 ++++++ 6 files changed, 77 insertions(+), 11 deletions(-) create mode 100644 bin/package.sh diff --git a/CHANGELOG.md b/CHANGELOG.md index 2219f79f6..6b6205220 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,9 +3,11 @@ ------------------------------------------------------------------------------------------------------------- -# 5.4.1 (2020-08-16) +# 5.4.1 (2020-08-19) ### 新特性 +* 【core 】 StrUtil增加firstNonXXX方法(issue#1020@Github) +* 【core 】 BeanCopier修改规则,可选bean拷贝空字段报错问题(pr#160@Gitee) ### Bug修复# ------------------------------------------------------------------------------------------------------------- diff --git a/bin/package.sh b/bin/package.sh new file mode 100644 index 000000000..a0064feb5 --- /dev/null +++ b/bin/package.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +exec mvn -T 1C clean source:jar javadoc:javadoc package -Dmaven.test.skip=false -Dmaven.javadoc.skip=false 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 10fb83b65..d1420333a 100644 --- 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 @@ -13,7 +13,6 @@ import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ModifierUtil; import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.TypeUtil; @@ -275,19 +274,13 @@ public class BeanCopier implements Copier, Serializable { // valueProvider在没有对值做转换且当类型不匹配的时候,执行默认转换 propClass = prop.getFieldClass(); if (false ==propClass.isInstance(value)) { - value = Convert.convert(propClass, value); + value = Convert.convertWithCheck(propClass, value, null, copyOptions.ignoreError); if (null == value && copyOptions.ignoreNullValue) { continue;// 当允许跳过空时,跳过 } } - if(null == setterMethod){ - // 直接注入值 - ReflectUtil.setFieldValue(bean, field, value); - } else{ - // 执行set方法注入值 - ReflectUtil.invoke(bean, setterMethod, value); - } + prop.setValue(bean, value); } catch (Exception e) { if (false ==copyOptions.ignoreError) { throw new UtilException(e, "Inject [{}] error!", prop.getFieldName()); diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java index 999fc0b65..a63934807 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java @@ -7,6 +7,7 @@ import cn.hutool.core.comparator.CompareUtil; import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.lang.Editor; import cn.hutool.core.lang.Filter; +import cn.hutool.core.lang.Matcher; import java.lang.reflect.Array; import java.nio.ByteBuffer; @@ -299,9 +300,23 @@ public class ArrayUtil { */ @SuppressWarnings("unchecked") public static T firstNonNull(T... array) { + return firstMatch(Objects::nonNull, array); + } + + /** + * 返回数组中第一个匹配规则的值 + * + * @param 数组元素类型 + * @param matcher 匹配接口,实现此接口自定义匹配规则 + * @param array 数组 + * @return 非空元素,如果不存在非空元素或数组为空,返回{@code null} + * @since 3.0.7 + */ + @SuppressWarnings("unchecked") + public static T firstMatch(Matcher matcher, T... array) { if (isNotEmpty(array)) { for (final T val : array) { - if (null != val) { + if(matcher.match(val)){ return val; } } diff --git a/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java index dfd1f4d81..19b3469de 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java @@ -4337,4 +4337,45 @@ public class StrUtil { } return sb.toString(); } + + /** + * 返回第一个非{@code null} 元素 + * + * @param strs 多个元素 + * @param 元素类型 + * @return 第一个非空元素,如果给定的数组为空或者都为空,返回{@code null} + * @since 5.4.1 + */ + @SuppressWarnings("unchecked") + public T firstNonNull(T... strs) { + return ArrayUtil.firstNonNull(strs); + } + + /** + * 返回第一个非empty 元素 + * + * @param strs 多个元素 + * @param 元素类型 + * @return 第一个非空元素,如果给定的数组为空或者都为空,返回{@code null} + * @since 5.4.1 + * @see #isNotEmpty(CharSequence) + */ + @SuppressWarnings("unchecked") + public T firstNonEmpty(T... strs) { + return ArrayUtil.firstMatch(StrUtil::isNotEmpty, strs); + } + + /** + * 返回第一个非blank 元素 + * + * @param strs 多个元素 + * @param 元素类型 + * @return 第一个非空元素,如果给定的数组为空或者都为空,返回{@code null} + * @since 5.4.1 + * @see #isNotBlank(CharSequence) + */ + @SuppressWarnings("unchecked") + public T firstNonBlank(T... strs) { + return ArrayUtil.firstMatch(StrUtil::isNotBlank, strs); + } } diff --git a/hutool-core/src/test/java/cn/hutool/core/util/CharUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/CharUtilTest.java index 7c08d98a0..cef99452b 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/CharUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/CharUtilTest.java @@ -26,4 +26,16 @@ public class CharUtilTest { char a = 'a'; Assert.assertTrue(CharUtil.isChar(a)); } + + @Test + public void isBlankCharTest(){ + char a = '\u00A0'; + Assert.assertTrue(CharUtil.isBlankChar(a)); + + char a2 = '\u0020'; + Assert.assertTrue(CharUtil.isBlankChar(a2)); + + char a3 = '\u3000'; + Assert.assertTrue(CharUtil.isBlankChar(a3)); + } }