From 83460af7ef883d5a370662b86d2b0f1274d63cf8 Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 26 Nov 2019 11:21:34 +0800 Subject: [PATCH] fix bug --- CHANGELOG.md | 5 +- .../java/cn/hutool/core/convert/Convert.java | 32 +++++++++++- .../OptNullBasicTypeFromObjectGetter.java | 50 +++++++------------ .../OptNullBasicTypeFromStringGetter.java | 41 ++++++--------- .../core/getter/OptNullBasicTypeGetter.java | 48 +++++++----------- .../src/main/java/cn/hutool/core/img/Img.java | 29 ++++++++--- .../main/java/cn/hutool/core/img/ImgUtil.java | 13 +++-- .../hutool/core/map/CamelCaseLinkedMap.java | 2 +- .../java/cn/hutool/core/map/CamelCaseMap.java | 4 +- .../core/map/CaseInsensitiveLinkedMap.java | 2 +- .../java/cn/hutool/core/map/MapProxy.java | 10 ++-- .../java/cn/hutool/core/map/MapWrapper.java | 19 +++++-- .../java/cn/hutool/core/util/XmlUtil.java | 8 ++- .../java/cn/hutool/core/util/XmlUtilTest.java | 22 +++++--- .../main/java/cn/hutool/json/JSONArray.java | 18 +++++-- .../main/java/cn/hutool/json/JSONGetter.java | 18 +++---- .../main/java/cn/hutool/json/JSONObject.java | 9 ++-- .../java/cn/hutool/setting/AbsSetting.java | 2 +- 18 files changed, 192 insertions(+), 140 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9285dd1e4..b4a3a1a9c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,11 +8,14 @@ ### 新特性 * 【core 】 解决NumberUtil导致的ambiguous问题(issue#630@Github) * 【core 】 BeanUtil.isEmpty()忽略字段支持,增加isNotEmpty(issue#629@Github) -* 【extra 】 邮件发送后获取message-id(issue#I15FKR@Gitee) +* 【extra】 邮件发送后获取message-id(issue#I15FKR@Gitee) +* 【core 】 CaseInsensitiveMap/CamelCaseMap增加toString(issue#636@Github) +* 【core 】 XmlUtil多节点改进(issue#I15I0R@Gitee) ### Bug修复 * 【extra】 修复SFTP.upload上传失败的问题 * 【db】 修复findLike匹配错误问题 +* 【core 】 修复scale方法透明无效问题(issue#I15L5S@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 f5a9ef759..c13a2b4d2 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/Convert.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/Convert.java @@ -4,6 +4,8 @@ import java.lang.reflect.Type; import java.math.BigDecimal; import java.math.BigInteger; import java.nio.charset.Charset; +import java.time.Instant; +import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.TimeUnit; @@ -444,7 +446,35 @@ public class Convert { public static Date toDate(Object value, Date defaultValue) { return convertQuietly(Date.class, value, defaultValue); } - + + /** + * LocalDateTime
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + * @since 5.0.7 + */ + public static Date toLocalDateTime(Object value, Date defaultValue) { + return convertQuietly(LocalDateTime.class, value, defaultValue); + } + + /** + * Instant
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + * @since 5.0.7 + */ + public static Date toInstant(Object value, Date defaultValue) { + return convertQuietly(Instant.class, value, defaultValue); + } + /** * 转换为Date
* 如果给定的值为空,或者转换失败,返回null
diff --git a/hutool-core/src/main/java/cn/hutool/core/getter/OptNullBasicTypeFromObjectGetter.java b/hutool-core/src/main/java/cn/hutool/core/getter/OptNullBasicTypeFromObjectGetter.java index a693ca8c8..3317ffb51 100644 --- a/hutool-core/src/main/java/cn/hutool/core/getter/OptNullBasicTypeFromObjectGetter.java +++ b/hutool-core/src/main/java/cn/hutool/core/getter/OptNullBasicTypeFromObjectGetter.java @@ -10,21 +10,20 @@ import cn.hutool.core.convert.Convert; * 基本类型的getter接口抽象实现,所有类型的值获取都是通过将getObj获得的值转换而来
* 用户只需实现getObj方法即可,其他类型将会从Object结果中转换 * 在不提供默认值的情况下, 如果值不存在或获取错误,返回null
+ * * @author Looly */ -public abstract class OptNullBasicTypeFromObjectGetter extends OptNullBasicTypeGetter{ +public interface OptNullBasicTypeFromObjectGetter extends OptNullBasicTypeGetter{ - @Override - public String getStr(K key, String defaultValue) { + default String getStr(K key, String defaultValue) { final Object obj = getObj(key); if(null == obj) { return defaultValue; } return Convert.toStr(obj, defaultValue); } - - @Override - public Integer getInt(K key, Integer defaultValue) { + + default Integer getInt(K key, Integer defaultValue) { final Object obj = getObj(key); if(null == obj) { return defaultValue; @@ -32,8 +31,7 @@ public abstract class OptNullBasicTypeFromObjectGetter extends OptNullBasicTy return Convert.toInt(obj, defaultValue); } - @Override - public Short getShort(K key, Short defaultValue) { + default Short getShort(K key, Short defaultValue) { final Object obj = getObj(key); if(null == obj) { return defaultValue; @@ -41,8 +39,7 @@ public abstract class OptNullBasicTypeFromObjectGetter extends OptNullBasicTy return Convert.toShort(obj, defaultValue); } - @Override - public Boolean getBool(K key, Boolean defaultValue) { + default Boolean getBool(K key, Boolean defaultValue) { final Object obj = getObj(key); if(null == obj) { return defaultValue; @@ -50,8 +47,7 @@ public abstract class OptNullBasicTypeFromObjectGetter extends OptNullBasicTy return Convert.toBool(obj, defaultValue); } - @Override - public Long getLong(K key, Long defaultValue) { + default Long getLong(K key, Long defaultValue) { final Object obj = getObj(key); if(null == obj) { return defaultValue; @@ -59,17 +55,15 @@ public abstract class OptNullBasicTypeFromObjectGetter extends OptNullBasicTy return Convert.toLong(obj, defaultValue); } - @Override - public Character getChar(K key, Character defaultValue) { + default Character getChar(K key, Character defaultValue) { final Object obj = getObj(key); if(null == obj) { return defaultValue; } return Convert.toChar(obj, defaultValue); } - - @Override - public Float getFloat(K key, Float defaultValue) { + + default Float getFloat(K key, Float defaultValue) { final Object obj = getObj(key); if(null == obj) { return defaultValue; @@ -77,8 +71,7 @@ public abstract class OptNullBasicTypeFromObjectGetter extends OptNullBasicTy return Convert.toFloat(obj, defaultValue); } - @Override - public Double getDouble(K key, Double defaultValue) { + default Double getDouble(K key, Double defaultValue) { final Object obj = getObj(key); if(null == obj) { return defaultValue; @@ -86,8 +79,7 @@ public abstract class OptNullBasicTypeFromObjectGetter extends OptNullBasicTy return Convert.toDouble(obj, defaultValue); } - @Override - public Byte getByte(K key, Byte defaultValue) { + default Byte getByte(K key, Byte defaultValue) { final Object obj = getObj(key); if(null == obj) { return defaultValue; @@ -95,8 +87,7 @@ public abstract class OptNullBasicTypeFromObjectGetter extends OptNullBasicTy return Convert.toByte(obj, defaultValue); } - @Override - public BigDecimal getBigDecimal(K key, BigDecimal defaultValue) { + default BigDecimal getBigDecimal(K key, BigDecimal defaultValue) { final Object obj = getObj(key); if(null == obj) { return defaultValue; @@ -104,26 +95,23 @@ public abstract class OptNullBasicTypeFromObjectGetter extends OptNullBasicTy return Convert.toBigDecimal(obj, defaultValue); } - @Override - public BigInteger getBigInteger(K key, BigInteger defaultValue) { + default BigInteger getBigInteger(K key, BigInteger defaultValue) { final Object obj = getObj(key); if(null == obj) { return defaultValue; } return Convert.toBigInteger(obj, defaultValue); } - - @Override - public > E getEnum(Class clazz, K key, E defaultValue) { + + default > E getEnum(Class clazz, K key, E defaultValue) { final Object obj = getObj(key); if(null == obj) { return defaultValue; } return Convert.toEnum(clazz, obj, defaultValue); } - - @Override - public Date getDate(K key, Date defaultValue) { + + default Date getDate(K key, Date defaultValue) { final Object obj = getObj(key); if(null == obj) { return defaultValue; diff --git a/hutool-core/src/main/java/cn/hutool/core/getter/OptNullBasicTypeFromStringGetter.java b/hutool-core/src/main/java/cn/hutool/core/getter/OptNullBasicTypeFromStringGetter.java index 13e6eecd4..c0562ec24 100644 --- a/hutool-core/src/main/java/cn/hutool/core/getter/OptNullBasicTypeFromStringGetter.java +++ b/hutool-core/src/main/java/cn/hutool/core/getter/OptNullBasicTypeFromStringGetter.java @@ -12,70 +12,57 @@ import cn.hutool.core.convert.Convert; * * @author Looly */ -public abstract class OptNullBasicTypeFromStringGetter extends OptNullBasicTypeGetter { +public interface OptNullBasicTypeFromStringGetter extends OptNullBasicTypeGetter { - @Override - public Object getObj(K key, Object defaultValue) { + default Object getObj(K key, Object defaultValue) { return getStr(key, null == defaultValue ? null : defaultValue.toString()); } - @Override - public Integer getInt(K key, Integer defaultValue) { + default Integer getInt(K key, Integer defaultValue) { return Convert.toInt(getStr(key), defaultValue); } - @Override - public Short getShort(K key, Short defaultValue) { + default Short getShort(K key, Short defaultValue) { return Convert.toShort(getStr(key), defaultValue); } - @Override - public Boolean getBool(K key, Boolean defaultValue) { + default Boolean getBool(K key, Boolean defaultValue) { return Convert.toBool(getStr(key), defaultValue); } - @Override - public Long getLong(K key, Long defaultValue) { + default Long getLong(K key, Long defaultValue) { return Convert.toLong(getStr(key), defaultValue); } - @Override - public Character getChar(K key, Character defaultValue) { + default Character getChar(K key, Character defaultValue) { return Convert.toChar(getStr(key), defaultValue); } - @Override - public Float getFloat(K key, Float defaultValue) { + default Float getFloat(K key, Float defaultValue) { return Convert.toFloat(getStr(key), defaultValue); } - @Override - public Double getDouble(K key, Double defaultValue) { + default Double getDouble(K key, Double defaultValue) { return Convert.toDouble(getStr(key), defaultValue); } - @Override - public Byte getByte(K key, Byte defaultValue) { + default Byte getByte(K key, Byte defaultValue) { return Convert.toByte(getStr(key), defaultValue); } - @Override - public BigDecimal getBigDecimal(K key, BigDecimal defaultValue) { + default BigDecimal getBigDecimal(K key, BigDecimal defaultValue) { return Convert.toBigDecimal(getStr(key), defaultValue); } - @Override - public BigInteger getBigInteger(K key, BigInteger defaultValue) { + default BigInteger getBigInteger(K key, BigInteger defaultValue) { return Convert.toBigInteger(getStr(key), defaultValue); } - @Override - public > E getEnum(Class clazz, K key, E defaultValue) { + default > E getEnum(Class clazz, K key, E defaultValue) { return Convert.toEnum(clazz, getStr(key), defaultValue); } - @Override - public Date getDate(K key, Date defaultValue) { + default Date getDate(K key, Date defaultValue) { return Convert.toDate(getStr(key), defaultValue); } } diff --git a/hutool-core/src/main/java/cn/hutool/core/getter/OptNullBasicTypeGetter.java b/hutool-core/src/main/java/cn/hutool/core/getter/OptNullBasicTypeGetter.java index 45b40f6a6..df992aa34 100644 --- a/hutool-core/src/main/java/cn/hutool/core/getter/OptNullBasicTypeGetter.java +++ b/hutool-core/src/main/java/cn/hutool/core/getter/OptNullBasicTypeGetter.java @@ -8,13 +8,12 @@ import java.util.Date; * 基本类型的getter接口抽象实现
* 提供一个统一的接口定义返回不同类型的值(基本类型)
* 在不提供默认值的情况下, 如果值不存在或获取错误,返回null
- * 用户只需实现{@code com.xiaoleilu.hutool.getter.OptBasicTypeGetter}接口即可 + * 用户只需实现{@link OptBasicTypeGetter}接口即可 * @author Looly */ -public abstract class OptNullBasicTypeGetter implements BasicTypeGetter, OptBasicTypeGetter{ +public interface OptNullBasicTypeGetter extends BasicTypeGetter, OptBasicTypeGetter{ - @Override - public Object getObj(K key) { + default Object getObj(K key) { return getObj(key, null); } @@ -25,8 +24,7 @@ public abstract class OptNullBasicTypeGetter implements BasicTypeGetter, O * @param key 属性名 * @return 属性值 */ - @Override - public String getStr(K key){ + default String getStr(K key){ return this.getStr(key, null); } @@ -37,8 +35,7 @@ public abstract class OptNullBasicTypeGetter implements BasicTypeGetter, O * @param key 属性名 * @return 属性值 */ - @Override - public Integer getInt(K key) { + default Integer getInt(K key) { return this.getInt(key, null); } @@ -49,8 +46,7 @@ public abstract class OptNullBasicTypeGetter implements BasicTypeGetter, O * @param key 属性名 * @return 属性值 */ - @Override - public Short getShort(K key){ + default Short getShort(K key){ return this.getShort(key, null); } @@ -61,8 +57,7 @@ public abstract class OptNullBasicTypeGetter implements BasicTypeGetter, O * @param key 属性名 * @return 属性值 */ - @Override - public Boolean getBool(K key){ + default Boolean getBool(K key){ return this.getBool(key, null); } @@ -73,8 +68,7 @@ public abstract class OptNullBasicTypeGetter implements BasicTypeGetter, O * @param key 属性名 * @return 属性值 */ - @Override - public Long getLong(K key){ + default Long getLong(K key){ return this.getLong(key, null); } @@ -85,8 +79,7 @@ public abstract class OptNullBasicTypeGetter implements BasicTypeGetter, O * @param key 属性名 * @return 属性值 */ - @Override - public Character getChar(K key){ + default Character getChar(K key){ return this.getChar(key, null); } @@ -97,8 +90,7 @@ public abstract class OptNullBasicTypeGetter implements BasicTypeGetter, O * @param key 属性名 * @return 属性值 */ - @Override - public Float getFloat(K key){ + default Float getFloat(K key){ return this.getFloat(key, null); } @@ -109,11 +101,10 @@ public abstract class OptNullBasicTypeGetter implements BasicTypeGetter, O * @param key 属性名 * @return 属性值 */ - @Override - public Double getDouble(K key){ + default Double getDouble(K key){ return this.getDouble(key, null); } - + /** * 获取byte型属性值
* 无值或获取错误返回null @@ -121,8 +112,7 @@ public abstract class OptNullBasicTypeGetter implements BasicTypeGetter, O * @param key 属性名 * @return 属性值 */ - @Override - public Byte getByte(K key){ + default Byte getByte(K key){ return this.getByte(key, null); } @@ -133,8 +123,7 @@ public abstract class OptNullBasicTypeGetter implements BasicTypeGetter, O * @param key 属性名 * @return 属性值 */ - @Override - public BigDecimal getBigDecimal(K key){ + default BigDecimal getBigDecimal(K key){ return this.getBigDecimal(key, null); } @@ -145,8 +134,7 @@ public abstract class OptNullBasicTypeGetter implements BasicTypeGetter, O * @param key 属性名 * @return 属性值 */ - @Override - public BigInteger getBigInteger(K key){ + default BigInteger getBigInteger(K key){ return this.getBigInteger(key, null); } @@ -158,8 +146,7 @@ public abstract class OptNullBasicTypeGetter implements BasicTypeGetter, O * @param key 属性名 * @return 属性值 */ - @Override - public > E getEnum(Class clazz, K key) { + default > E getEnum(Class clazz, K key) { return this.getEnum(clazz, key, null); } @@ -170,8 +157,7 @@ public abstract class OptNullBasicTypeGetter implements BasicTypeGetter, O * @param key 属性名 * @return 属性值 */ - @Override - public Date getDate(K key) { + default Date getDate(K key) { return this.getDate(key, null); } } diff --git a/hutool-core/src/main/java/cn/hutool/core/img/Img.java b/hutool-core/src/main/java/cn/hutool/core/img/Img.java index eefd84636..9058c533f 100644 --- a/hutool-core/src/main/java/cn/hutool/core/img/Img.java +++ b/hutool-core/src/main/java/cn/hutool/core/img/Img.java @@ -53,7 +53,7 @@ public class Img implements Serializable { /** * 目标图片文件格式,用于写出 */ - private String targetImageType = ImgUtil.IMAGE_TYPE_JPG; + private String targetImageType; /** * 计算x,y坐标的时候是否从中心做为原始坐标开始计算 */ @@ -140,7 +140,22 @@ public class Img implements Serializable { * @param srcImage 来源图片 */ public Img(BufferedImage srcImage) { + this(srcImage, null); + } + + /** + * 构造 + * + * @param srcImage 来源图片 + * @param targetImageType 目标图片类型 + * @since 5.0.7 + */ + public Img(BufferedImage srcImage, String targetImageType) { this.srcImage = srcImage; + if(null == targetImageType){ + targetImageType = ImgUtil.IMAGE_TYPE_JPG; + } + this.targetImageType = targetImageType; } /** @@ -294,15 +309,14 @@ public class Img implements Serializable { srcHeight = srcImage.getHeight(null); srcWidth = srcImage.getWidth(null); - if (null == fixedColor) {// 补白 - fixedColor = Color.WHITE; - } final BufferedImage image = new BufferedImage(width, height, getTypeInt()); Graphics2D g = image.createGraphics(); // 设置背景 - g.setBackground(fixedColor); - g.clearRect(0, 0, width, height); + if(null != fixedColor){ + g.setBackground(fixedColor); + g.clearRect(0, 0, width, height); + } // 在中间贴图 g.drawImage(srcImage, (width - srcWidth) / 2, (height - srcHeight) / 2, srcWidth, srcHeight, fixedColor, null); @@ -586,6 +600,7 @@ public class Img implements Serializable { } if (targetFile.exists()) { + //noinspection ResultOfMethodCallIgnored targetFile.delete(); } @@ -624,6 +639,7 @@ public class Img implements Serializable { * @see BufferedImage#TYPE_INT_RGB */ private int getTypeInt() { + //noinspection SwitchStatementWithTooFewBranches switch (this.targetImageType) { case ImgUtil.IMAGE_TYPE_PNG: return BufferedImage.TYPE_INT_ARGB; @@ -678,6 +694,7 @@ public class Img implements Serializable { if (degree >= 90) { if (degree / 90 % 2 == 1) { int temp = height; + //noinspection SuspiciousNameCombination height = width; width = temp; } 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 58980cc27..492ab2cc0 100644 --- a/hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/img/ImgUtil.java @@ -171,17 +171,20 @@ public class ImgUtil { /** * 缩放图像(按高度和宽度缩放)
- * 缩放后默认为jpeg格式 + * 缩放后默认格式与源图片相同,无法识别原图片默认JPG * * @param srcImageFile 源图像文件地址 * @param destImageFile 缩放后的图像地址 * @param width 缩放后的宽度 * @param height 缩放后的高度 - * @param fixedColor 比例不对时补充的颜色,不补充为null + * @param fixedColor 补充的颜色,不补充为null * @throws IORuntimeException IO异常 */ public static void scale(File srcImageFile, File destImageFile, int width, int height, Color fixedColor) throws IORuntimeException { - write(scale(read(srcImageFile), width, height, fixedColor), destImageFile); + Img.from(srcImageFile)// + .setTargetImageType(FileUtil.extName(destImageFile))// + .scale(width, height, fixedColor)// + .write(destImageFile); } /** @@ -397,12 +400,12 @@ public class ImgUtil { if (srcWidth % destWidth == 0) { cols = srcWidth / destWidth; } else { - cols = (int) Math.floor(srcWidth / destWidth) + 1; + cols = (int) Math.floor((double)srcWidth / destWidth) + 1; } if (srcHeight % destHeight == 0) { rows = srcHeight / destHeight; } else { - rows = (int) Math.floor(srcHeight / destHeight) + 1; + rows = (int) Math.floor((double)srcHeight / destHeight) + 1; } // 循环建立切片 Image tag; diff --git a/hutool-core/src/main/java/cn/hutool/core/map/CamelCaseLinkedMap.java b/hutool-core/src/main/java/cn/hutool/core/map/CamelCaseLinkedMap.java index 47f0e00b3..a9b77f6c3 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/CamelCaseLinkedMap.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/CamelCaseLinkedMap.java @@ -60,7 +60,7 @@ public class CamelCaseLinkedMap extends CamelCaseMap { * @param loadFactor 加载因子 */ public CamelCaseLinkedMap(int initialCapacity, float loadFactor) { - super(new HashMap(initialCapacity, loadFactor)); + super(new HashMap<>(initialCapacity, loadFactor)); } // ------------------------------------------------------------------------- Constructor end } diff --git a/hutool-core/src/main/java/cn/hutool/core/map/CamelCaseMap.java b/hutool-core/src/main/java/cn/hutool/core/map/CamelCaseMap.java index 8dc8d4faf..0da049ec0 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/CamelCaseMap.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/CamelCaseMap.java @@ -62,7 +62,7 @@ public class CamelCaseMap extends CustomKeyMap { * @param loadFactor 加载因子 */ public CamelCaseMap(int initialCapacity, float loadFactor) { - super(new HashMap(initialCapacity, loadFactor)); + super(new HashMap<>(initialCapacity, loadFactor)); } // ------------------------------------------------------------------------- Constructor end @@ -74,7 +74,7 @@ public class CamelCaseMap extends CustomKeyMap { */ @Override protected Object customKey(Object key) { - if (null != key && key instanceof CharSequence) { + if (key instanceof CharSequence) { key = StrUtil.toCamelCase(key.toString()); } return key; diff --git a/hutool-core/src/main/java/cn/hutool/core/map/CaseInsensitiveLinkedMap.java b/hutool-core/src/main/java/cn/hutool/core/map/CaseInsensitiveLinkedMap.java index 8bc486ee2..5fe5d503a 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/CaseInsensitiveLinkedMap.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/CaseInsensitiveLinkedMap.java @@ -61,7 +61,7 @@ public class CaseInsensitiveLinkedMap extends CaseInsensitiveMap { * @param loadFactor 加载因子 */ public CaseInsensitiveLinkedMap(int initialCapacity, float loadFactor) { - super(new LinkedHashMap(initialCapacity, loadFactor)); + super(new LinkedHashMap<>(initialCapacity, loadFactor)); } // ------------------------------------------------------------------------- Constructor end } diff --git a/hutool-core/src/main/java/cn/hutool/core/map/MapProxy.java b/hutool-core/src/main/java/cn/hutool/core/map/MapProxy.java index 7865e2ad1..2d9875605 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/MapProxy.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/MapProxy.java @@ -21,7 +21,7 @@ import cn.hutool.core.util.StrUtil; * @author looly * @since 3.2.0 */ -public class MapProxy extends OptNullBasicTypeFromObjectGetter implements Map, InvocationHandler, Serializable { +public class MapProxy implements Map, OptNullBasicTypeFromObjectGetter, InvocationHandler, Serializable { private static final long serialVersionUID = 1L; @SuppressWarnings("rawtypes") @@ -89,7 +89,7 @@ public class MapProxy extends OptNullBasicTypeFromObjectGetter implement return map.remove(key); } - @SuppressWarnings("unchecked") + @SuppressWarnings({"unchecked", "NullableProblems"}) @Override public void putAll(Map m) { map.putAll(m); @@ -100,19 +100,19 @@ public class MapProxy extends OptNullBasicTypeFromObjectGetter implement map.clear(); } - @SuppressWarnings("unchecked") + @SuppressWarnings({"unchecked", "NullableProblems"}) @Override public Set keySet() { return map.keySet(); } - @SuppressWarnings("unchecked") + @SuppressWarnings({"unchecked", "NullableProblems"}) @Override public Collection values() { return map.values(); } - @SuppressWarnings("unchecked") + @SuppressWarnings({"unchecked", "NullableProblems"}) @Override public Set> entrySet() { return map.entrySet(); diff --git a/hutool-core/src/main/java/cn/hutool/core/map/MapWrapper.java b/hutool-core/src/main/java/cn/hutool/core/map/MapWrapper.java index 436a0dbde..79cdd94f4 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/MapWrapper.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/MapWrapper.java @@ -79,6 +79,7 @@ public class MapWrapper implements Map, Iterable>, S } @Override + @SuppressWarnings("NullableProblems") public void putAll(Map m) { raw.putAll(m); } @@ -89,23 +90,31 @@ public class MapWrapper implements Map, Iterable>, S } @Override - public Set keySet() { - return raw.keySet(); - } - - @Override + @SuppressWarnings("NullableProblems") public Collection values() { return raw.values(); } @Override + @SuppressWarnings("NullableProblems") + public Set keySet() { + return raw.keySet(); + } + + @Override + @SuppressWarnings("NullableProblems") public Set> entrySet() { return raw.entrySet(); } @Override + @SuppressWarnings("NullableProblems") public Iterator> iterator() { return this.entrySet().iterator(); } + @Override + public String toString() { + return raw.toString(); + } } diff --git a/hutool-core/src/main/java/cn/hutool/core/util/XmlUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/XmlUtil.java index efbfb0fc1..33c50d549 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/XmlUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/XmlUtil.java @@ -33,6 +33,7 @@ import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; +import cn.hutool.core.collection.CollUtil; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -756,7 +757,12 @@ public class XmlUtil { childNode = nodeList.item(i); if (isElement(childNode)) { childEle = (Element) childNode; - result.put(childEle.getNodeName(), childEle.getTextContent()); + final Object value = result.get(childEle.getNodeName()); + if(null != value){ + result.put(childEle.getNodeName(), CollUtil.newArrayList(value, childEle.getTextContent())); + } else{ + result.put(childEle.getNodeName(), childEle.getTextContent()); + } } } return result; diff --git a/hutool-core/src/test/java/cn/hutool/core/util/XmlUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/XmlUtilTest.java index 463e40826..c29d8583c 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/XmlUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/XmlUtilTest.java @@ -1,17 +1,16 @@ package cn.hutool.core.util; -import java.util.LinkedHashMap; -import java.util.Map; - -import javax.xml.xpath.XPathConstants; - +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapBuilder; +import cn.hutool.core.map.MapUtil; import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; import org.w3c.dom.Document; -import cn.hutool.core.map.MapBuilder; -import cn.hutool.core.map.MapUtil; +import javax.xml.xpath.XPathConstants; +import java.util.LinkedHashMap; +import java.util.Map; /** * {@link XmlUtil} 工具类 @@ -86,6 +85,15 @@ public class XmlUtilTest { Assert.assertEquals("1", map.get("successCounts")); } + @Test + public void xmlToMapTest2() { + String xml = "张三李四"; + Map map = XmlUtil.xmlToMap(xml); + + Assert.assertEquals(1, map.size()); + Assert.assertEquals(CollUtil.newArrayList("张三", "李四"), map.get("name")); + } + @Test public void mapToXmlTest() { Map map = MapBuilder.create(new LinkedHashMap())// diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONArray.java b/hutool-json/src/main/java/cn/hutool/json/JSONArray.java index 49610bc68..bd8bd5d85 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONArray.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONArray.java @@ -19,6 +19,8 @@ import java.util.List; import java.util.ListIterator; import java.util.RandomAccess; +import static cn.hutool.json.JSONConverter.*; + /** * JSON数组
* JSON数组是表示中括号括住的数据表现形式
@@ -30,7 +32,7 @@ import java.util.RandomAccess; * * @author looly */ -public class JSONArray extends JSONGetter implements JSON, List, RandomAccess { +public class JSONArray implements JSON, JSONGetter, List, RandomAccess { private static final long serialVersionUID = 2664900568717612292L; /** 默认初始大小 */ @@ -236,7 +238,7 @@ public class JSONArray extends JSONGetter implements JSON, List @Override public T getByPath(String expression, Class resultType) { - return JSONConverter.jsonConvert(resultType, getByPath(expression), true); + return jsonConvert(resultType, getByPath(expression), true); } @Override @@ -314,6 +316,7 @@ public class JSONArray extends JSONGetter implements JSON, List } } + @SuppressWarnings("NullableProblems") @Override public Iterator iterator() { return rawList.iterator(); @@ -344,13 +347,14 @@ public class JSONArray extends JSONGetter implements JSON, List return rawList.contains(o); } + @SuppressWarnings("NullableProblems") @Override public Object[] toArray() { return rawList.toArray(); } @Override - @SuppressWarnings("unchecked") + @SuppressWarnings({"unchecked", "NullableProblems"}) public T[] toArray(T[] a) { return (T[]) JSONConverter.toArray(this, a.getClass().getComponentType()); } @@ -370,11 +374,13 @@ public class JSONArray extends JSONGetter implements JSON, List return rawList.remove(o); } + @SuppressWarnings("NullableProblems") @Override public boolean containsAll(Collection c) { return rawList.containsAll(c); } + @SuppressWarnings("NullableProblems") @Override public boolean addAll(Collection c) { if (CollUtil.isEmpty(c)) { @@ -386,6 +392,7 @@ public class JSONArray extends JSONGetter implements JSON, List return true; } + @SuppressWarnings("NullableProblems") @Override public boolean addAll(int index, Collection c) { if (CollUtil.isEmpty(c)) { @@ -398,11 +405,13 @@ public class JSONArray extends JSONGetter implements JSON, List return rawList.addAll(index, list); } + @SuppressWarnings("NullableProblems") @Override public boolean removeAll(Collection c) { return this.rawList.removeAll(c); } + @SuppressWarnings("NullableProblems") @Override public boolean retainAll(Collection c) { return this.rawList.retainAll(c); @@ -446,16 +455,19 @@ public class JSONArray extends JSONGetter implements JSON, List return this.rawList.lastIndexOf(o); } + @SuppressWarnings("NullableProblems") @Override public ListIterator listIterator() { return this.rawList.listIterator(); } + @SuppressWarnings("NullableProblems") @Override public ListIterator listIterator(int index) { return this.rawList.listIterator(index); } + @SuppressWarnings("NullableProblems") @Override public List subList(int fromIndex, int toIndex) { return this.rawList.subList(fromIndex, toIndex); diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONGetter.java b/hutool-json/src/main/java/cn/hutool/json/JSONGetter.java index d7b91723a..547e15c99 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONGetter.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONGetter.java @@ -9,7 +9,7 @@ import cn.hutool.core.getter.OptNullBasicTypeFromObjectGetter; * * @param Key类型 */ -public abstract class JSONGetter extends OptNullBasicTypeFromObjectGetter{ +public interface JSONGetter extends OptNullBasicTypeFromObjectGetter{ /** * key对应值是否为null或无此key @@ -17,7 +17,7 @@ public abstract class JSONGetter extends OptNullBasicTypeFromObjectGetter{ * @param key 键 * @return true 无此key或值为null或{@link JSONNull#NULL}返回false,其它返回true */ - public boolean isNull(K key) { + default boolean isNull(K key) { return JSONNull.NULL.equals(this.getObj(key)); } @@ -28,7 +28,7 @@ public abstract class JSONGetter extends OptNullBasicTypeFromObjectGetter{ * @return 字符串类型值 * @since 4.2.2 */ - public String getStrEscaped(K key) { + default String getStrEscaped(K key) { return getStrEscaped(key, null); } @@ -40,7 +40,7 @@ public abstract class JSONGetter extends OptNullBasicTypeFromObjectGetter{ * @return 字符串类型值 * @since 4.2.2 */ - public String getStrEscaped(K key, String defaultValue) { + default String getStrEscaped(K key, String defaultValue) { return JSONUtil.escape(getStr(key, defaultValue)); } @@ -51,7 +51,7 @@ public abstract class JSONGetter extends OptNullBasicTypeFromObjectGetter{ * @param key KEY * @return JSONArray对象,如果值为null或者非JSONArray类型,返回null */ - public JSONArray getJSONArray(K key) { + default JSONArray getJSONArray(K key) { final Object object = this.getObj(key); if(null == object) { return null; @@ -70,7 +70,7 @@ public abstract class JSONGetter extends OptNullBasicTypeFromObjectGetter{ * @param key KEY * @return JSONArray对象,如果值为null或者非JSONObject类型,返回null */ - public JSONObject getJSONObject(K key) { + default JSONObject getJSONObject(K key) { final Object object = this.getObj(key); if(null == object) { return null; @@ -92,7 +92,7 @@ public abstract class JSONGetter extends OptNullBasicTypeFromObjectGetter{ * @return Bean对象,如果值为null或者非JSONObject类型,返回null * @since 3.1.1 */ - public T getBean(K key, Class beanType) { + default T getBean(K key, Class beanType) { final JSONObject obj = getJSONObject(key); return (null == obj) ? null : obj.toBean(beanType); } @@ -108,7 +108,7 @@ public abstract class JSONGetter extends OptNullBasicTypeFromObjectGetter{ * @throws ConvertException 转换异常 * @since 3.0.8 */ - public T get(K key, Class type) throws ConvertException{ + default T get(K key, Class type) throws ConvertException{ return get(key, type, false); } @@ -123,7 +123,7 @@ public abstract class JSONGetter extends OptNullBasicTypeFromObjectGetter{ * @throws ConvertException 转换异常 * @since 3.0.8 */ - public T get(K key, Class type, boolean ignoreError) throws ConvertException{ + default T get(K key, Class type, boolean ignoreError) throws ConvertException{ final Object value = this.getObj(key); if(null == value){ return null; diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONObject.java b/hutool-json/src/main/java/cn/hutool/json/JSONObject.java index 1ff889878..4ec0ce078 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONObject.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONObject.java @@ -37,7 +37,7 @@ import java.util.Set; * * @author looly */ -public class JSONObject extends JSONGetter implements JSON, Map { +public class JSONObject implements JSON, JSONGetter, Map { private static final long serialVersionUID = -330220388580734346L; /** 默认初始大小 */ @@ -163,7 +163,7 @@ public class JSONObject extends JSONGetter implements JSON, Map implements JSON, Map keySet() { return this.rawHashMap.keySet(); } + @SuppressWarnings("NullableProblems") @Override public Collection values() { return rawHashMap.values(); } + @SuppressWarnings("NullableProblems") @Override public Set> entrySet() { return rawHashMap.entrySet(); @@ -643,7 +646,7 @@ public class JSONObject extends JSONGetter implements JSON, Map implements Serializable { +public abstract class AbsSetting implements OptNullBasicTypeFromStringGetter, Serializable { private static final long serialVersionUID = 6200156302595905863L; private final static Log log = LogFactory.get();