diff --git a/CHANGELOG.md b/CHANGELOG.md index 702cfb421..ee34b8119 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ------------------------------------------------------------------------------------------------------------- -# 5.6.1 (2021-03-16) +# 5.6.1 (2021-03-18) ### 新特性 * 【crypto 】 SecureUtil去除final修饰符(issue#1474@Github) @@ -11,10 +11,13 @@ * 【core 】 新增函数式懒加载加载器(pr#275@Gitee) * 【http 】 UserAgentUtil增加miniProgram判断(issue#1475@Github) * 【db 】 增加Ignite数据库驱动识别 +* 【core 】 DateUtil.parse支持带毫秒的UTC时间 ### Bug修复 * 【core 】 修复IoUtil.readBytes的FileInputStream中isClose参数失效问题(issue#I3B7UD@Gitee) * 【core 】 修复DataUnit中KB不大写的问题 +* 【json 】 修复JSONUtil.getByPath类型错误问题(issue#I3BSDF@Gitee) +* 【core 】 修复BeanUtil.toBean提供null未返回null的问题(issue#I3BQPV@Gitee) ------------------------------------------------------------------------------------------------------------- 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 e99afde07..d60927168 100644 --- a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java @@ -544,6 +544,9 @@ public class BeanUtil { * @since 5.2.4 */ public static T toBean(Object source, Class clazz, CopyOptions options) { + if(null == source){ + return null; + } final T target = ReflectUtil.newInstanceIfPossible(clazz); copyProperties(source, target, options); return target; @@ -559,6 +562,9 @@ public class BeanUtil { * @return Bean */ public static T toBean(Class beanClass, ValueProvider valueProvider, CopyOptions copyOptions) { + if (null == beanClass || null == valueProvider) { + return null; + } return fillBean(ReflectUtil.newInstanceIfPossible(beanClass), valueProvider, copyOptions); } @@ -600,6 +606,9 @@ public class BeanUtil { * @return Map */ public static Map beanToMap(Object bean, boolean isToUnderlineCase, boolean ignoreNullValue) { + if (null == bean) { + return null; + } return beanToMap(bean, new LinkedHashMap<>(), isToUnderlineCase, ignoreNullValue); } @@ -614,7 +623,7 @@ public class BeanUtil { * @since 3.2.3 */ public static Map beanToMap(Object bean, Map targetMap, final boolean isToUnderlineCase, boolean ignoreNullValue) { - if (bean == null) { + if (null == bean) { return null; } @@ -639,7 +648,7 @@ public class BeanUtil { * @since 4.0.5 */ public static Map beanToMap(Object bean, Map targetMap, boolean ignoreNullValue, Editor keyEditor) { - if (bean == null) { + if (null == bean) { return null; } diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DatePattern.java b/hutool-core/src/main/java/cn/hutool/core/date/DatePattern.java index 912840d35..f89690eee 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/DatePattern.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DatePattern.java @@ -200,6 +200,15 @@ public class DatePattern { */ public static final FastDateFormat UTC_SIMPLE_FORMAT = FastDateFormat.getInstance(UTC_SIMPLE_PATTERN, TimeZone.getTimeZone("UTC")); + /** + * UTC时间:yyyy-MM-dd'T'HH:mm:ss.SSS + */ + public static final String UTC_SIMPLE_MS_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSS"; + /** + * UTC时间{@link FastDateFormat}:yyyy-MM-dd'T'HH:mm:ss.SSS + */ + public static final FastDateFormat UTC_SIMPLE_MS_FORMAT = FastDateFormat.getInstance(UTC_SIMPLE_MS_PATTERN, TimeZone.getTimeZone("UTC")); + /** * UTC时间:yyyy-MM-dd'T'HH:mm:ss'Z' */ diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java index c7acc35d6..9557a241e 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java @@ -836,6 +836,9 @@ public class DateUtil extends CalendarUtil { } else if (length == DatePattern.UTC_SIMPLE_PATTERN.length() - 2) { // 格式类似:2018-09-13T05:34:31 return parse(utcString, DatePattern.UTC_SIMPLE_FORMAT); + } else if (StrUtil.contains(utcString, CharUtil.DOT)){ + // 可能为: 2021-03-17T06:31:33.99 + return parse(utcString, DatePattern.UTC_SIMPLE_MS_FORMAT); } } // 没有更多匹配的时间格式 diff --git a/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java index f4654abc4..068a95063 100644 --- a/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java @@ -550,6 +550,13 @@ public class DateUtilTest { assert dt != null; dateStr = dt.toString(simpleDateFormat); Assert.assertEquals("2018-09-13 13:34:39.999", dateStr); + + // 使用UTC时区 + dateStr1 = "2018-09-13T13:34:39.99"; + dt = DateUtil.parse(dateStr1); + assert dt != null; + dateStr = dt.toString(); + Assert.assertEquals("2018-09-13 13:34:39", dateStr); } @Test diff --git a/hutool-extra/src/test/java/cn/hutool/extra/pinyin/PinyinUtilTest.java b/hutool-extra/src/test/java/cn/hutool/extra/pinyin/PinyinUtilTest.java index 5a837b813..0aa8cc1b7 100644 --- a/hutool-extra/src/test/java/cn/hutool/extra/pinyin/PinyinUtilTest.java +++ b/hutool-extra/src/test/java/cn/hutool/extra/pinyin/PinyinUtilTest.java @@ -39,6 +39,12 @@ public class PinyinUtilTest { Assert.assertEquals("h, s, d, y, g", result); } + @Test + public void getFirstLetterTest2(){ + final String result = PinyinUtil.getFirstLetter("崞阳", ", "); + Assert.assertEquals("g, y", result); + } + @Test public void getFirstLetterByPinyin4jTest(){ final Pinyin4jEngine engine = new Pinyin4jEngine(); diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java b/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java index 618150fcc..db1954d9b 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java @@ -543,7 +543,7 @@ public class JSONUtil { * @see JSON#getByPath(String) */ public static Object getByPath(JSON json, String expression) { - return (null == json || StrUtil.isBlank(expression)) ? null : json.getByPath(expression); + return getByPath(json, expression, null); } /** @@ -572,7 +572,15 @@ public class JSONUtil { */ @SuppressWarnings("unchecked") public static T getByPath(JSON json, String expression, T defaultValue) { - return (T) ObjectUtil.defaultIfNull(getByPath(json, expression), defaultValue); + if((null == json || StrUtil.isBlank(expression))){ + return defaultValue; + } + + if(null != defaultValue){ + final Class type = (Class) defaultValue.getClass(); + return ObjectUtil.defaultIfNull(json.getByPath(expression, type), defaultValue); + } + return (T) json.getByPath(expression); } /** diff --git a/hutool-json/src/test/java/cn/hutool/json/IssueI3BS4S.java b/hutool-json/src/test/java/cn/hutool/json/IssueI3BS4S.java new file mode 100644 index 000000000..0844cf073 --- /dev/null +++ b/hutool-json/src/test/java/cn/hutool/json/IssueI3BS4S.java @@ -0,0 +1,27 @@ +package cn.hutool.json; + +import cn.hutool.core.bean.BeanUtil; +import lombok.Data; +import org.junit.Assert; +import org.junit.Test; + +import java.time.LocalDateTime; + +/** + * 测试带毫秒的日期转换 + */ +public class IssueI3BS4S { + + @Test + public void toBeanTest(){ + String jsonStr = "{date: '2021-03-17T06:31:33.99'}"; + final Bean1 bean1 = new Bean1(); + BeanUtil.copyProperties(JSONUtil.parseObj(jsonStr), bean1); + Assert.assertEquals("2021-03-17T06:31:33.099", bean1.getDate().toString()); + } + + @Data + public static class Bean1{ + private LocalDateTime date; + } +} diff --git a/hutool-json/src/test/java/cn/hutool/json/JSONPathTest.java b/hutool-json/src/test/java/cn/hutool/json/JSONPathTest.java index ef4698315..c3ad1281f 100644 --- a/hutool-json/src/test/java/cn/hutool/json/JSONPathTest.java +++ b/hutool-json/src/test/java/cn/hutool/json/JSONPathTest.java @@ -5,7 +5,7 @@ import org.junit.Test; /** * JSON路径单元测试 - * + * * @author looly * */ @@ -19,4 +19,12 @@ public class JSONPathTest { value = JSONUtil.parseArray(json).getByPath("[1].name"); Assert.assertEquals("mingzi", value); } + + @Test + public void getByPathTest2(){ + String str = "{'accountId':111}"; + JSON json = JSONUtil.parse(str); + Long accountId = JSONUtil.getByPath(json, "$.accountId", 0L); + Assert.assertEquals(111L, accountId.longValue()); + } }