From c3f1fe50e4600a1857f552fb4fd40a54134b77b4 Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 28 Jul 2021 00:35:03 +0800 Subject: [PATCH] fix convert bug --- CHANGELOG.md | 13 +++----- .../copier/provider/MapValueProvider.java | 3 +- .../core/convert/impl/DateConverter.java | 18 +++++++---- .../cn/hutool/core/convert/ConvertTest.java | 7 ++++ .../poi/excel/reader/BeanSheetReader.java | 2 +- .../cn/hutool/poi/excel/Issue1729Test.java | 30 ++++++++++++++++++ .../src/test/resources/UserProjectDO.xlsx | Bin 0 -> 9004 bytes 7 files changed, 55 insertions(+), 18 deletions(-) create mode 100644 hutool-poi/src/test/java/cn/hutool/poi/excel/Issue1729Test.java create mode 100644 hutool-poi/src/test/resources/UserProjectDO.xlsx diff --git a/CHANGELOG.md b/CHANGELOG.md index 443f42ddd..d948c93d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,14 +3,7 @@ ------------------------------------------------------------------------------------------------------------- -# 5.7.7 (2021-07-27) - -### 🐣新特性 -### 🐞Bug修复 - -------------------------------------------------------------------------------------------------------------- - -# 5.7.6 (2021-07-26) +# 5.7.6 (2021-07-28) ### 🐣新特性 * 【core 】 增加FieldsComparator(pr#374@Gitee) @@ -30,7 +23,9 @@ * 【core 】 修复FileTypeUtil判断wps修改过的xlsx误判为jar的问题(pr#380@Gitee) * 【core 】 修复Sftp.isDir异常bug(pr#378@Gitee) * 【core 】 修复BeanUtil.copyProperties集合元素复制成功,读取失败的问题(issue#I41WKP@Gitee) -* 【core 】 修复NumberChineseFormatter.chineseToNumber十位数错误(issue#1726@Gitee) +* 【core 】 修复NumberChineseFormatter.chineseToNumber十位数错误(issue#1726@github) +* 【poi 】 修复BeanSheetReader.read中字段对象为空导致的报错(issue#1729@Github) +* 【core 】 修复DateConverter转换java.sql.Date问题(issue#1729@Github) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/copier/provider/MapValueProvider.java b/hutool-core/src/main/java/cn/hutool/core/bean/copier/provider/MapValueProvider.java index 7c84e4074..e054c29e2 100644 --- a/hutool-core/src/main/java/cn/hutool/core/bean/copier/provider/MapValueProvider.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/copier/provider/MapValueProvider.java @@ -62,8 +62,7 @@ public class MapValueProvider implements ValueProvider { return null; } - final Object value = map.get(key1); - return Convert.convertWithCheck(valueType, value, null, this.ignoreError); + return Convert.convertWithCheck(valueType, map.get(key1), null, this.ignoreError); } @Override diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/impl/DateConverter.java b/hutool-core/src/main/java/cn/hutool/core/convert/impl/DateConverter.java index a936c6e76..f659f42bd 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/impl/DateConverter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/impl/DateConverter.java @@ -1,13 +1,13 @@ package cn.hutool.core.convert.impl; import cn.hutool.core.convert.AbstractConverter; +import cn.hutool.core.convert.ConvertException; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import java.time.temporal.TemporalAccessor; import java.util.Calendar; -import java.util.Date; /** * 日期转换器 @@ -71,7 +71,7 @@ public class DateConverter extends AbstractConverter { } else { // 统一按照字符串处理 final String valueStr = convertToStr(value); - final Date date = StrUtil.isBlank(this.format) // + final java.util.Date date = StrUtil.isBlank(this.format) // ? DateUtil.parse(valueStr) // : DateUtil.parse(valueStr, this.format); if(null != date){ @@ -79,7 +79,7 @@ public class DateConverter extends AbstractConverter { } } - throw new UnsupportedOperationException(StrUtil.format("Unsupport Date type: {}", this.targetType.getName())); + throw new ConvertException("Can not convert {}:[{}] to {}", value.getClass().getName(), value, this.targetType.getName()); } /** @@ -105,7 +105,7 @@ public class DateConverter extends AbstractConverter { return new java.sql.Timestamp(date.getTime()); } - throw new UnsupportedOperationException(StrUtil.format("Unsupport Date type: {}", this.targetType.getName())); + throw new UnsupportedOperationException(StrUtil.format("Unsupported target Date type: {}", this.targetType.getName())); } /** @@ -116,7 +116,7 @@ public class DateConverter extends AbstractConverter { private java.util.Date wrap(long mills){ // 返回指定类型 if (java.util.Date.class == targetType) { - return new Date(mills); + return new java.util.Date(mills); } if (DateTime.class == targetType) { return DateUtil.date(mills); @@ -131,6 +131,12 @@ public class DateConverter extends AbstractConverter { return new java.sql.Timestamp(mills); } - throw new UnsupportedOperationException(StrUtil.format("Unsupport Date type: {}", this.targetType.getName())); + throw new UnsupportedOperationException(StrUtil.format("Unsupported target Date type: {}", this.targetType.getName())); + } + + @SuppressWarnings("unchecked") + @Override + public Class getTargetType() { + return (Class) this.targetType; } } diff --git a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java index 022e0ef68..25315c843 100644 --- a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java @@ -2,6 +2,7 @@ package cn.hutool.core.convert; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateException; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.TypeReference; import cn.hutool.core.util.ByteUtil; import lombok.AllArgsConstructor; @@ -310,4 +311,10 @@ public class ConvertTest { final Date date = Convert.toDate("2021-01"); Assert.assertNull(date); } + + @Test + public void toSqlDateTest(){ + final java.sql.Date date = Convert.convert(java.sql.Date.class, DateUtil.parse("2021-07-28")); + Assert.assertEquals("2021-07-28", date.toString()); + } } diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/reader/BeanSheetReader.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/reader/BeanSheetReader.java index 21b0cf9e8..e2801abc1 100644 --- a/hutool-poi/src/main/java/cn/hutool/poi/excel/reader/BeanSheetReader.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/reader/BeanSheetReader.java @@ -42,7 +42,7 @@ public class BeanSheetReader implements SheetReader> { final List beanList = new ArrayList<>(mapList.size()); for (Map map : mapList) { - beanList.add(BeanUtil.toBean(map, this.beanClass)); + beanList.add(BeanUtil.toBeanIgnoreError(map, this.beanClass)); } return beanList; } diff --git a/hutool-poi/src/test/java/cn/hutool/poi/excel/Issue1729Test.java b/hutool-poi/src/test/java/cn/hutool/poi/excel/Issue1729Test.java new file mode 100644 index 000000000..e693237ab --- /dev/null +++ b/hutool-poi/src/test/java/cn/hutool/poi/excel/Issue1729Test.java @@ -0,0 +1,30 @@ +package cn.hutool.poi.excel; + +import lombok.Data; +import org.junit.Assert; +import org.junit.Test; + +import java.util.List; + +/** + * issue#1729@Github
+ * 日期为空时返回""而非null,因此会导致日期等字段的转换错误,此处转bean时忽略错误。 + */ +public class Issue1729Test { + + @Test + public void readTest() { + final ExcelReader reader = ExcelUtil.getReader("UserProjectDO.xlsx"); + final List read = reader.read(0, 1, UserProjectDO.class); + Assert.assertEquals("aa", read.get(0).getProjectName()); + Assert.assertNull(read.get(0).getEndTrainTime()); + Assert.assertEquals("2020-02-02", read.get(0).getEndTestTime().toString()); + } + + @Data + public static class UserProjectDO { + private String projectName; + private java.sql.Date endTrainTime; + private java.sql.Date endTestTime; + } +} diff --git a/hutool-poi/src/test/resources/UserProjectDO.xlsx b/hutool-poi/src/test/resources/UserProjectDO.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9069b83761c143aeaf5fce30304e3fc85bfe3080 GIT binary patch literal 9004 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 literal 0 HcmV?d00001