From a38aea70f60dd634515ffb89f8e0b79346f9b74c Mon Sep 17 00:00:00 2001 From: majiang Date: Sat, 4 Jun 2022 11:31:31 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=94=99=E5=88=AB?= =?UTF-8?q?=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hutool/core/date/LocalDateTimeUtil.java | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java index d2f3a25ab..708880749 100755 --- a/hutool-core/src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/LocalDateTimeUtil.java @@ -5,24 +5,11 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReUtil; import cn.hutool.core.util.StrUtil; -import java.time.DayOfWeek; -import java.time.Duration; -import java.time.Instant; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.time.Period; -import java.time.ZoneId; -import java.time.ZonedDateTime; +import java.time.*; import java.time.chrono.ChronoLocalDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; -import java.time.temporal.ChronoField; -import java.time.temporal.ChronoUnit; -import java.time.temporal.Temporal; -import java.time.temporal.TemporalAccessor; -import java.time.temporal.TemporalUnit; -import java.time.temporal.WeekFields; +import java.time.temporal.*; import java.util.Date; import java.util.TimeZone; @@ -30,7 +17,7 @@ import java.util.TimeZone; * JDK8+中的{@link LocalDateTime} 工具类封装 * * @author looly - * @see DateUtil java7和一下版本,使用Date工具类 + * @see DateUtil java7和以下版本,使用Date工具类 * @see DatePattern 常用格式工具类 * @since 5.3.9 */ From 106361abd9a8b670586db215569ac6677ad6892f Mon Sep 17 00:00:00 2001 From: majiang Date: Sat, 4 Jun 2022 11:31:55 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E6=97=B6=E5=8C=BA=E7=9A=84=E7=9B=B8=E5=85=B3=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/core/date/DateUtil.java | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) 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 6fd4c4230..553fe869c 100755 --- a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java @@ -18,6 +18,7 @@ import java.text.SimpleDateFormat; import java.time.Instant; import java.time.LocalDateTime; import java.time.Year; +import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAccessor; import java.util.*; @@ -2100,6 +2101,45 @@ public class DateUtil extends CalendarUtil { return LocalDateTimeUtil.of(date); } + /** + * {@link Date} 转换时区 + * + * @param date {@link Date} + * @param zoneId{@link zoneId} + * @return {@link DateTime} + * @see DateTime(Date,ZoneId) + * @since 5.0.5 + */ + public static DateTime convertTimeZone(Date date, String zoneId) { + return new DateTime(date, ZoneUtil.toTimeZone(ZoneId.of(zoneId))); + } + + /** + * {@link Date} 转换时区 + * + * @param date {@link Date} + * @param zoneId{@link zoneId} + * @return {@link DateTime} + * @see DateTime(Date, ZoneId ) + * @since 5.0.5 + */ + public static DateTime convertTimeZone(Date date, ZoneId zoneId) { + return new DateTime(date, ZoneUtil.toTimeZone(zoneId)); + } + + /** + * {@link Date} 转换时区 + * + * @param date {@link Date} + * @param timeZone{@link timeZone} + * @return {@link DateTime} + * @see DateTime(Date,ZoneId) + * @since 5.0.5 + */ + public static DateTime convertTimeZone(Date date, TimeZone timeZone) { + return new DateTime(date, timeZone); + } + /** * 获得指定年份的总天数 * From 78b6c9909ea017618198ae1b07665260abbd66db Mon Sep 17 00:00:00 2001 From: Looly Date: Sun, 5 Jun 2022 23:40:34 +0800 Subject: [PATCH 3/6] fix null bug --- CHANGELOG.md | 3 ++- .../java/cn/hutool/core/convert/Convert.java | 15 +++++++++------ .../java/cn/hutool/core/date/DateUtil.java | 19 +++---------------- .../cn/hutool/core/convert/ConvertTest.java | 12 ++++++++++++ 4 files changed, 26 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2decfb5a..78412988d 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,13 +3,14 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.3.M1 (2022-05-30) +# 5.8.3.M1 (2022-06-05) ### 🐣新特性 * 【extra 】 mail增加writeTimeout参数支持(issue#2355@Github) * 【core 】 FileTypeUtil增加pptx扩展名支持(issue#I5A0GO@Gitee) ### 🐞Bug修复 * 【core 】 修复NumberUtil.isXXX空判断错误(issue#2356@Github) +* 【core 】 修复Convert.toSBC空指针问题(issue#I5APKK@Gitee) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/Convert.java b/hutool-core/src/main/java/cn/hutool/core/convert/Convert.java index 4d00a1ca8..a7ca4babb 100755 --- a/hutool-core/src/main/java/cn/hutool/core/convert/Convert.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/Convert.java @@ -754,23 +754,26 @@ public class Convert { // ----------------------------------------------------------------------- 全角半角转换 /** - * 半角转全角 + * 半角转全角,{@code null}返回{@code null} * * @param input String. - * @return 全角字符串. + * @return 全角字符串,{@code null}返回{@code null} */ public static String toSBC(String input) { return toSBC(input, null); } /** - * 半角转全角 + * 半角转全角,{@code null}返回{@code null} * * @param input String * @param notConvertSet 不替换的字符集合 - * @return 全角字符串. + * @return 全角字符串,{@code null}返回{@code null} */ public static String toSBC(String input, Set notConvertSet) { + if(StrUtil.isEmpty(input)){ + return input; + } final char[] c = input.toCharArray(); for (int i = 0; i < c.length; i++) { if (null != notConvertSet && notConvertSet.contains(c[i])) { @@ -1096,7 +1099,7 @@ public class Convert { /** * long转byte数组
* 默认以小端序转换
- * from: https://stackoverflow.com/questions/4485128/how-do-i-convert-long-to-byte-and-back-in-java + * from: https://stackoverflow.com/questions/4485128/how-do-i-convert-long-to-byte-and-back-in-java * * @param longValue long值 * @return byte数组 @@ -1109,7 +1112,7 @@ public class Convert { /** * byte数组转long
* 默认以小端序转换
- * from: https://stackoverflow.com/questions/4485128/how-do-i-convert-long-to-byte-and-back-in-java + * from: https://stackoverflow.com/questions/4485128/how-do-i-convert-long-to-byte-and-back-in-java * * @param bytes byte数组 * @return long值 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 553fe869c..de910dc30 100755 --- a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java @@ -1338,7 +1338,7 @@ public class DateUtil extends CalendarUtil { return offset(date, DateField.HOUR_OF_DAY, offset); } - /** + /**w * 偏移天 * * @param date 日期 @@ -2101,19 +2101,6 @@ public class DateUtil extends CalendarUtil { return LocalDateTimeUtil.of(date); } - /** - * {@link Date} 转换时区 - * - * @param date {@link Date} - * @param zoneId{@link zoneId} - * @return {@link DateTime} - * @see DateTime(Date,ZoneId) - * @since 5.0.5 - */ - public static DateTime convertTimeZone(Date date, String zoneId) { - return new DateTime(date, ZoneUtil.toTimeZone(ZoneId.of(zoneId))); - } - /** * {@link Date} 转换时区 * @@ -2121,7 +2108,7 @@ public class DateUtil extends CalendarUtil { * @param zoneId{@link zoneId} * @return {@link DateTime} * @see DateTime(Date, ZoneId ) - * @since 5.0.5 + * @since 5.8.3 */ public static DateTime convertTimeZone(Date date, ZoneId zoneId) { return new DateTime(date, ZoneUtil.toTimeZone(zoneId)); @@ -2134,7 +2121,7 @@ public class DateUtil extends CalendarUtil { * @param timeZone{@link timeZone} * @return {@link DateTime} * @see DateTime(Date,ZoneId) - * @since 5.0.5 + * @since 5.8.3 */ public static DateTime convertTimeZone(Date date, TimeZone timeZone) { return new DateTime(date, timeZone); 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 89ab9421f..047540888 100755 --- a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertTest.java @@ -392,4 +392,16 @@ public class ConvertTest { final LocalDate convert = Convert.convert(LocalDate.class, localDateTime); Assert.assertEquals(localDateTime.toLocalDate(), convert); } + + @Test + public void toSBCTest(){ + final String s = Convert.toSBC(null); + Assert.assertNull(s); + } + + @Test + public void toDBCTest(){ + final String s = Convert.toDBC(null); + Assert.assertNull(s); + } } From bd7d0881787ec2721827bb30a726d1cca719cf25 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 6 Jun 2022 00:38:48 +0800 Subject: [PATCH 4/6] fix json bug --- CHANGELOG.md | 3 ++- .../core/convert/impl/ArrayConverter.java | 11 ++++++++++ .../main/java/cn/hutool/core/img/ImgUtil.java | 2 +- hutool-json/src/test/java/Issue2365Test.java | 21 +++++++++++++++++++ 4 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 hutool-json/src/test/java/Issue2365Test.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 78412988d..0e4e67f09 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.3.M1 (2022-06-05) +# 5.8.3.M1 (2022-06-06) ### 🐣新特性 * 【extra 】 mail增加writeTimeout参数支持(issue#2355@Github) @@ -11,6 +11,7 @@ ### 🐞Bug修复 * 【core 】 修复NumberUtil.isXXX空判断错误(issue#2356@Github) * 【core 】 修复Convert.toSBC空指针问题(issue#I5APKK@Gitee) +* 【json 】 修复Bean中存在bytes,无法转换问题(issue#2365@Github) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/impl/ArrayConverter.java b/hutool-core/src/main/java/cn/hutool/core/convert/impl/ArrayConverter.java index ae4d72fe2..99cf27b2d 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/impl/ArrayConverter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/impl/ArrayConverter.java @@ -1,5 +1,6 @@ package cn.hutool.core.convert.impl; +import cn.hutool.core.codec.Base64; import cn.hutool.core.collection.IterUtil; import cn.hutool.core.convert.AbstractConverter; import cn.hutool.core.convert.Convert; @@ -124,6 +125,16 @@ public class ArrayConverter extends AbstractConverter { return convertArrayToArray(value.toString().toCharArray()); } + //issue#2365 + // 字符串转bytes,首先判断是否为Base64,是则转换,否则按照默认getBytes方法。 + if(targetComponentType == byte.class){ + final String str = value.toString(); + if(Base64.isBase64(str)){ + return Base64.decode(value.toString()); + } + return str.getBytes(); + } + // 单纯字符串情况下按照逗号分隔后劈开 final String[] strings = StrUtil.splitToArray(value.toString(), CharUtil.COMMA); return convertArrayToArray(strings); diff --git a/hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java b/hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java index 7fc019675..a13290c26 100755 --- a/hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java @@ -1046,7 +1046,7 @@ public class ImgUtil { /** * 旋转图片为指定角度
- * 来自:http://blog.51cto.com/cping1982/130066 + * 来自:http://blog.51cto.com/cping1982/130066 * * @param image 目标图像 * @param degree 旋转角度 diff --git a/hutool-json/src/test/java/Issue2365Test.java b/hutool-json/src/test/java/Issue2365Test.java new file mode 100644 index 000000000..f3d0aafaa --- /dev/null +++ b/hutool-json/src/test/java/Issue2365Test.java @@ -0,0 +1,21 @@ +import cn.hutool.json.JSONUtil; +import lombok.Data; +import org.junit.Assert; +import org.junit.Test; + +public class Issue2365Test { + + @Test + public void toBeanTest(){ + String jsonStr = "{\"fileName\":\"aaa\",\"fileBytes\":\"AQ==\"}"; + final FileInfo fileInfo = JSONUtil.toBean(jsonStr, FileInfo.class); + Assert.assertEquals("aaa", fileInfo.getFileName()); + Assert.assertArrayEquals(new byte[]{1}, fileInfo.getFileBytes()); + } + + @Data + public static class FileInfo { + private String fileName; + private byte[] fileBytes; + } +} From 1c6bdf67e05fda310fc948c2a7e477deadf1646f Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 6 Jun 2022 01:27:16 +0800 Subject: [PATCH 5/6] fix bug --- CHANGELOG.md | 1 + .../src/main/java/cn/hutool/core/util/ArrayUtil.java | 7 +++++++ .../src/test/java/cn/hutool/core/util/ArrayUtilTest.java | 7 +++++++ 3 files changed, 15 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e4e67f09..49a273fc9 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ * 【core 】 修复NumberUtil.isXXX空判断错误(issue#2356@Github) * 【core 】 修复Convert.toSBC空指针问题(issue#I5APKK@Gitee) * 【json 】 修复Bean中存在bytes,无法转换问题(issue#2365@Github) +* 【core 】 ArrayUtil.setOrAppend()传入空数组时,抛出异常(issue#I5APJE@Gitee) ------------------------------------------------------------------------------------------------------------- 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 9e535b668..b8c273e80 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java @@ -347,6 +347,13 @@ public class ArrayUtil extends PrimitiveArrayUtil { Array.set(buffer, index, value); return buffer; } else { + if(ArrayUtil.isEmpty(buffer)){ + // issue#I5APJE + // 可变长类型在buffer为空的情况下,类型会被擦除,导致报错,此处修正 + final T[] values = newArray(value.getClass(), 1); + values[0] = value; + return append(buffer, values); + } return append(buffer, value); } } diff --git a/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java index de3f0d911..f0dc8a029 100755 --- a/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java @@ -527,4 +527,11 @@ public class ArrayUtilTest { result = ArrayUtil.replace(g, 0, h); Assert.assertArrayEquals(g, result); } + + @Test + public void setOrAppendTest(){ + String[] arr = new String[0]; + String[] newArr = ArrayUtil.setOrAppend(arr, 0, "Good");// ClassCastException + Assert.assertArrayEquals(new String[]{"Good"}, newArr); + } } From 6f1a8d4214f9c06b7ebd6b570c63ec6c9e4cb52c Mon Sep 17 00:00:00 2001 From: huangzhiquan <6498754713@qq.com> Date: Tue, 7 Jun 2022 09:36:33 +0800 Subject: [PATCH 6/6] =?UTF-8?q?fix:=201.HttpBase=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=8E=B7=E5=8F=96bodyBytes=E5=82=A8=E5=AD=98=E4=B8=BB=E4=BD=93?= =?UTF-8?q?=E6=96=B9=E6=B3=95=EF=BC=88=E4=BF=AE=E5=A4=8D=E4=BD=BF=E7=94=A8?= =?UTF-8?q?HttpRequest=E6=8B=A6=E6=88=AA=E5=99=A8=E6=97=B6=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E8=8E=B7=E5=8F=96=E5=88=B0bodyBytes=E4=B8=BB=E4=BD=93?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hutool-http/src/main/java/cn/hutool/http/HttpBase.java | 9 +++++++++ .../src/main/java/cn/hutool/http/HttpResponse.java | 1 + 2 files changed, 10 insertions(+) diff --git a/hutool-http/src/main/java/cn/hutool/http/HttpBase.java b/hutool-http/src/main/java/cn/hutool/http/HttpBase.java index 8b3ebe441..743d51a23 100644 --- a/hutool-http/src/main/java/cn/hutool/http/HttpBase.java +++ b/hutool-http/src/main/java/cn/hutool/http/HttpBase.java @@ -297,6 +297,15 @@ public abstract class HttpBase { return (T) this; } + /** + * 获取bodyBytes存储字节码 + * + * @return byte[] + */ + public byte[] bodyBytes() { + return this.bodyBytes; + } + /** * 返回字符集 * diff --git a/hutool-http/src/main/java/cn/hutool/http/HttpResponse.java b/hutool-http/src/main/java/cn/hutool/http/HttpResponse.java index 9bbeff7c3..21f018f2b 100755 --- a/hutool-http/src/main/java/cn/hutool/http/HttpResponse.java +++ b/hutool-http/src/main/java/cn/hutool/http/HttpResponse.java @@ -249,6 +249,7 @@ public class HttpResponse extends HttpBase implements Closeable { * * @return byte[] */ + @Override public byte[] bodyBytes() { sync(); return this.bodyBytes;