From 1f9d1c288885cf35c3b9db646930eb1f4b33decd Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 29 Oct 2020 16:54:51 +0800 Subject: [PATCH] fix bug --- CHANGELOG.md | 4 +- .../java/cn/hutool/core/bean/BeanUtil.java | 2 +- .../hutool/core/bean/copier/BeanCopier.java | 8 ++- .../hutool/core/bean/copier/CopyOptions.java | 3 +- .../cn/hutool/core/bean/BeanUtilTest.java | 51 ++++++++++++++++--- 5 files changed, 55 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 93a2cee96..5d464d0ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ------------------------------------------------------------------------------------------------------------- -# 5.4.7 (2020-10-28) +# 5.4.7 (2020-10-29) ### 新特性 * 【core 】 增加OptionalBean(pr#1182@Github) @@ -13,7 +13,9 @@ * 【http 】 增加SoapClient增加addSOAPHeader重载 * 【http 】 ArrayUtil增加containsAll方法 * 【http 】 增加CharsetDetector + ### Bug修复 +* 【core 】 修复BeanUtil.beanToMap方法中editor返回null没有去掉的问题 ------------------------------------------------------------------------------------------------------------- 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 1eefdef40..ec86b740a 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 @@ -618,7 +618,7 @@ public class BeanUtil { * @param bean bean对象 * @param targetMap 目标的Map * @param ignoreNullValue 是否忽略值为空的字段 - * @param keyEditor 属性字段(Map的key)编辑器,用于筛选、编辑key + * @param keyEditor 属性字段(Map的key)编辑器,用于筛选、编辑key,如果这个Editor返回null则忽略这个字段 * @return Map * @since 4.0.5 */ 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 4708a22e6..99d4eb91e 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 @@ -172,6 +172,12 @@ public class BeanCopier implements Copier, Serializable { return; } + // 对key做映射,映射后为null的忽略之 + key = copyOptions.editFieldName(copyOptions.getMappedFieldName(key, false)); + if(null == key){ + return; + } + Object value; try { value = prop.getValue(bean); @@ -188,8 +194,6 @@ public class BeanCopier implements Copier, Serializable { return; } - // 对key做映射 - key = copyOptions.editFieldName(copyOptions.getMappedFieldName(key, false)); targetMap.put(key, value); }); } diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/copier/CopyOptions.java b/hutool-core/src/main/java/cn/hutool/core/bean/copier/CopyOptions.java index 812559f65..fd783d97a 100644 --- a/hutool-core/src/main/java/cn/hutool/core/bean/copier/CopyOptions.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/copier/CopyOptions.java @@ -194,7 +194,8 @@ public class CopyOptions implements Serializable { /** * 设置字段属性编辑器,用于自定义属性转换规则,例如驼峰转下划线等
- * 此转换器只针对源端的字段做转换,请确认转换后与目标端字段一致 + * 此转换器只针对源端的字段做转换,请确认转换后与目标端字段一致
+ * 当转换后的字段名为null时忽略这个字段 * * @param fieldNameEditor 字段属性编辑器,用于自定义属性转换规则,例如驼峰转下划线等 * @return CopyOptions diff --git a/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java index a74683f05..56ec38dac 100644 --- a/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java @@ -16,8 +16,11 @@ import java.io.Serializable; import java.lang.reflect.Type; import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.Date; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.Map; import java.util.UUID; @@ -76,7 +79,7 @@ public class BeanUtilTest { } @Test - public void toBeanTest(){ + public void toBeanTest() { SubPerson person = new SubPerson(); person.setAge(14); person.setOpenid("11213232"); @@ -95,7 +98,7 @@ public class BeanUtilTest { * 忽略转换错误测试 */ @Test - public void toBeanIgnoreErrorTest(){ + public void toBeanIgnoreErrorTest() { HashMap map = CollUtil.newHashMap(); map.put("name", "Joe"); // 错误的类型,此处忽略 @@ -372,7 +375,7 @@ public class BeanUtilTest { @Getter @Setter public static class Person { - private String name; + private String name; private int age; private String openid; } @@ -384,6 +387,7 @@ public class BeanUtilTest { private int age; private String openid; } + public static class Person2 { public Person2(String name, int age, String openid) { @@ -445,9 +449,9 @@ public class BeanUtilTest { Assert.assertEquals(info.getBookID(), entity.getBookId()); Assert.assertEquals(info.getCode(), entity.getCode2()); } - + @Test - public void copyBeanTest(){ + public void copyBeanTest() { Food info = new Food(); info.setBookID("0"); info.setCode("123"); @@ -473,14 +477,14 @@ public class BeanUtilTest { } @Test - public void setPropertiesTest(){ + public void setPropertiesTest() { Map resultMap = MapUtil.newHashMap(); BeanUtil.setProperty(resultMap, "codeList[0].name", "张三"); Assert.assertEquals("{codeList={0={name=张三}}}", resultMap.toString()); } @Test - public void beanCopyTest(){ + public void beanCopyTest() { final Station station = new Station(); station.setId(123456L); @@ -499,7 +503,38 @@ public class BeanUtilTest { } @Data - public static class Entity{ + public static class Entity { private T id; } + + @Test + public void toMapTest() { + // 测试转map的时候返回key + String name = null; + PrivilegeIClassification a = new PrivilegeIClassification(); + a.setId("1"); + a.setName("2"); + a.setCode("3"); + a.setCreateTime(new Date()); + a.setSortOrder(9L); + + Map f = BeanUtil.beanToMap( + a, + new LinkedHashMap<>(), + false, + key -> Arrays.asList("id", "name", "code", "sortOrder").contains(key) ? key : null); + Assert.assertFalse(f.containsKey(null)); + } + + @Data + public static class PrivilegeIClassification implements Serializable { + private static final long serialVersionUID = 1L; + + private String id; + private String name; + private String code; + private Long rowStatus; + private Long sortOrder; + private Date createTime; + } }