From 2f6662b4aa70653486df4d89d8200ae05fd3655f Mon Sep 17 00:00:00 2001 From: Looly Date: Sat, 4 Oct 2025 17:37:21 +0800 Subject: [PATCH] add test --- .../java/cn/hutool/v7/core/bean/BeanUtil.java | 53 +++++++++---------- .../cn/hutool/v7/core/bean/path/BeanPath.java | 2 +- .../cn/hutool/v7/core/bean/BeanUtilTest.java | 22 ++++++++ 3 files changed, 49 insertions(+), 28 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/v7/core/bean/BeanUtil.java b/hutool-core/src/main/java/cn/hutool/v7/core/bean/BeanUtil.java index e1d8bf4df3..e72464f377 100644 --- a/hutool-core/src/main/java/cn/hutool/v7/core/bean/BeanUtil.java +++ b/hutool-core/src/main/java/cn/hutool/v7/core/bean/BeanUtil.java @@ -183,6 +183,7 @@ public class BeanUtil { } // endregion + // region ----- beanPath /** * 获取Bean中的属性值 * @@ -221,6 +222,7 @@ public class BeanUtil { public static void setProperty(final Object bean, final String expression, final Object value) { BeanPath.of(expression).setValue(bean, value); } + // endregion // region ----- toBean @@ -728,9 +730,31 @@ public class BeanUtil { return hasSetter(clazz) || hasPublicField(clazz); } - // endregion - // region ----- hasXXX + /** + * 检查Bean
+ * 遍历Bean的字段并断言检查字段,当某个字段: + * 断言为{@code true} 时,返回{@code true}并不再检查后续字段;
+ * 断言为{@code false}时,继续检查后续字段 + * + * @param bean Bean + * @param predicate 断言 + * @return 是否触发断言为真 + */ + public static boolean checkBean(final Object bean, final Predicate predicate) { + if (null == bean) { + return true; + } + for (final Field field : FieldUtil.getFields(bean.getClass())) { + if (ModifierUtil.isStatic(field)) { + continue; + } + if (predicate.test(field)) { + return true; + } + } + return false; + } /** * 判断是否有Setter方法
@@ -829,31 +853,6 @@ public class BeanUtil { } // endregion - /** - * 检查Bean
- * 遍历Bean的字段并断言检查字段,当某个字段: - * 断言为{@code true} 时,返回{@code true}并不再检查后续字段;
- * 断言为{@code false}时,继续检查后续字段 - * - * @param bean Bean - * @param predicate 断言 - * @return 是否触发断言为真 - */ - public static boolean checkBean(final Object bean, final Predicate predicate) { - if (null == bean) { - return true; - } - for (final Field field : FieldUtil.getFields(bean.getClass())) { - if (ModifierUtil.isStatic(field)) { - continue; - } - if (predicate.test(field)) { - return true; - } - } - return false; - } - /** * 获取Getter或Setter方法名对应的字段名称,规则如下: *
    diff --git a/hutool-core/src/main/java/cn/hutool/v7/core/bean/path/BeanPath.java b/hutool-core/src/main/java/cn/hutool/v7/core/bean/path/BeanPath.java index 2fcef9a9c0..f7e12d2600 100644 --- a/hutool-core/src/main/java/cn/hutool/v7/core/bean/path/BeanPath.java +++ b/hutool-core/src/main/java/cn/hutool/v7/core/bean/path/BeanPath.java @@ -120,7 +120,7 @@ public class BeanPath implements Iterator> { } // 每一个边界符之前的表达式是一个完整的KEY,开始处理KEY } - if (builder.length() > 0) { + if (!builder.isEmpty()) { this.node = NodeFactory.createNode(builder.toString()); // 如果以[结束,表示后续还有表达式,需保留'[',如name[0] this.child = StrUtil.nullIfEmpty(expression.substring(c == CharUtil.BRACKET_START ? i : i + 1)); diff --git a/hutool-core/src/test/java/cn/hutool/v7/core/bean/BeanUtilTest.java b/hutool-core/src/test/java/cn/hutool/v7/core/bean/BeanUtilTest.java index df280cdc78..7f9a0eaeb3 100644 --- a/hutool-core/src/test/java/cn/hutool/v7/core/bean/BeanUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/v7/core/bean/BeanUtilTest.java @@ -1131,4 +1131,26 @@ public class BeanUtilTest { final PropertyDescriptor nonExistingField = BeanUtil.getPropertyDescriptor(Person.class, "nonExistingField"); assertNull(nonExistingField); } + + @Test + void testBeanToMap_IgnoreNullValue() { + Person person = new Person(); + person.setName(null); + person.setAge(25); + + // 忽略空值 + Map map = BeanUtil.beanToMap(person, false, true); + assertEquals(1, map.size()); + assertEquals(25, map.get("age")); + assertFalse(map.containsKey("name")); + + // 不忽略空值 + map = BeanUtil.beanToMap(person, false, false); + assertEquals(3, map.size()); + assertTrue(map.containsKey("name")); + assertNull(map.get("name")); + assertEquals(25, map.get("age")); + assertTrue(map.containsKey("openid")); + assertNull(map.get("openid")); + } }