From 3c4adf34c5786f1dc1c2617252bbcedf051bbd91 Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 7 Jun 2024 15:22:23 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DBeanUtil.isBean=E5=88=A4?= =?UTF-8?q?=E6=96=ADDict=E9=94=99=E8=AF=AF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/hutool/core/bean/BeanUtil.java | 6 + .../org/dromara/hutool/core/map/Dict.java | 1 + .../hutool/core/bean/BeanUtilTest.java | 209 +++++++++--------- .../format/parser/RegexDateParserTest.java | 1 + 4 files changed, 117 insertions(+), 100 deletions(-) diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/bean/BeanUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/bean/BeanUtil.java index 0d28cdb29..9c87c3fda 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/bean/BeanUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/bean/BeanUtil.java @@ -24,6 +24,7 @@ import org.dromara.hutool.core.convert.Convert; import org.dromara.hutool.core.convert.impl.RecordConverter; import org.dromara.hutool.core.lang.mutable.MutableEntry; import org.dromara.hutool.core.map.CaseInsensitiveMap; +import org.dromara.hutool.core.map.Dict; import org.dromara.hutool.core.map.MapUtil; import org.dromara.hutool.core.reflect.ClassUtil; import org.dromara.hutool.core.reflect.ConstructorUtil; @@ -742,6 +743,11 @@ public class BeanUtil { if (null == clazz) { return false; } + // issue#I9VTZG,排除定义setXXX的预定义类 + if(Dict.class == clazz){ + return false; + } + return hasSetter(clazz) || hasPublicField(clazz); } diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/map/Dict.java b/hutool-core/src/main/java/org/dromara/hutool/core/map/Dict.java index aa7a41c1a..d33c344c4 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/map/Dict.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/map/Dict.java @@ -28,6 +28,7 @@ import org.dromara.hutool.core.lang.getter.TypeGetter; import java.lang.reflect.Type; import java.util.*; + /** * 字典对象,扩充了LinkedHashMap中的方法 * diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/bean/BeanUtilTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/bean/BeanUtilTest.java index 792c66ea1..43b782a80 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/bean/BeanUtilTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/bean/BeanUtilTest.java @@ -24,6 +24,7 @@ import org.dromara.hutool.core.bean.copier.ValueProvider; import org.dromara.hutool.core.bean.path.BeanPath; import org.dromara.hutool.core.collection.ListUtil; import org.dromara.hutool.core.collection.set.SetUtil; +import org.dromara.hutool.core.map.Dict; import org.dromara.hutool.core.map.MapBuilder; import org.dromara.hutool.core.map.MapUtil; import org.dromara.hutool.core.text.StrUtil; @@ -41,6 +42,8 @@ import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; +import static org.junit.jupiter.api.Assertions.*; + /** * Bean工具单元测试 * @@ -53,7 +56,13 @@ public class BeanUtilTest { // HashMap不包含setXXX方法,不是bean final boolean isBean = BeanUtil.isWritableBean(HashMap.class); - Assertions.assertFalse(isBean); + assertFalse(isBean); + } + + @Test + public void issueI9VTZGTest() { + final boolean bean = BeanUtil.isWritableBean(Dict.class); + assertFalse(bean); } @Test @@ -79,8 +88,8 @@ public class BeanUtilTest { }, CopyOptions.of()); - Assertions.assertEquals("张三", person.getName()); - Assertions.assertEquals(18, person.getAge()); + assertEquals("张三", person.getName()); + assertEquals(18, person.getAge()); } @Test @@ -92,9 +101,9 @@ public class BeanUtilTest { .build(); final SubPerson person = BeanUtil.fillBeanWithMap( map, new SubPerson(), CopyOptions.of().setIgnoreCase(true)); - Assertions.assertEquals("Joe", person.getName()); - Assertions.assertEquals(12, person.getAge()); - Assertions.assertEquals("DFDFSDFWERWER", person.getOpenid()); + assertEquals("Joe", person.getName()); + assertEquals(12, person.getAge()); + assertEquals("DFDFSDFWERWER", person.getOpenid()); } @Test @@ -106,11 +115,11 @@ public class BeanUtilTest { person.setSubName("sub名字"); final Map map = BeanUtil.toBean(person, Map.class); - Assertions.assertEquals("测试A11", map.get("name")); - Assertions.assertEquals(14, map.get("age")); - Assertions.assertEquals("11213232", map.get("openid")); + assertEquals("测试A11", map.get("name")); + assertEquals(14, map.get("age")); + assertEquals("11213232", map.get("openid")); // static属性应被忽略 - Assertions.assertFalse(map.containsKey("SUBNAME")); + assertFalse(map.containsKey("SUBNAME")); } /** @@ -124,9 +133,9 @@ public class BeanUtilTest { map.put("age", "aaaaaa"); final Person person = BeanUtil.toBean(map, Person.class, CopyOptions.of().setIgnoreError(true)); - Assertions.assertEquals("Joe", person.getName()); + assertEquals("Joe", person.getName()); // 错误的类型,不copy这个字段,使用对象创建的默认值 - Assertions.assertEquals(0, person.getAge()); + assertEquals(0, person.getAge()); } @Test @@ -136,8 +145,8 @@ public class BeanUtilTest { map.put("aGe", 12); final Person person = BeanUtil.toBean(map, Person.class, CopyOptions.of().setIgnoreCase(true)); - Assertions.assertEquals("Joe", person.getName()); - Assertions.assertEquals(12, person.getAge()); + assertEquals("Joe", person.getName()); + assertEquals(12, person.getAge()); } @Test @@ -152,8 +161,8 @@ public class BeanUtilTest { mapping.put("b_age", "age"); final Person person = BeanUtil.toBean(map, Person.class, CopyOptions.of().setFieldMapping(mapping)); - Assertions.assertEquals("Joe", person.getName()); - Assertions.assertEquals(12, person.getAge()); + assertEquals("Joe", person.getName()); + assertEquals(12, person.getAge()); } /** @@ -167,8 +176,8 @@ public class BeanUtilTest { // 非空构造也可以实例化成功 final Person2 person = BeanUtil.toBean(map, Person2.class, CopyOptions.of()); - Assertions.assertEquals("Joe", person.name); - Assertions.assertEquals(12, person.age); + assertEquals("Joe", person.name); + assertEquals(12, person.age); } /** @@ -193,11 +202,11 @@ public class BeanUtilTest { final Map map = BeanUtil.beanToMap(person); - Assertions.assertEquals("测试A11", map.get("name")); - Assertions.assertEquals(14, map.get("age")); - Assertions.assertEquals("11213232", map.get("openid")); + assertEquals("测试A11", map.get("name")); + assertEquals(14, map.get("age")); + assertEquals("11213232", map.get("openid")); // static属性应被忽略 - Assertions.assertFalse(map.containsKey("SUBNAME")); + assertFalse(map.containsKey("SUBNAME")); } @Test @@ -210,11 +219,11 @@ public class BeanUtilTest { final Map map = BeanUtil.beanToMap(person, (String[])null); - Assertions.assertEquals("测试A11", map.get("name")); - Assertions.assertEquals(14, map.get("age")); - Assertions.assertEquals("11213232", map.get("openid")); + assertEquals("测试A11", map.get("name")); + assertEquals(14, map.get("age")); + assertEquals("11213232", map.get("openid")); // static属性应被忽略 - Assertions.assertFalse(map.containsKey("SUBNAME")); + assertFalse(map.containsKey("SUBNAME")); } @Test @@ -226,7 +235,7 @@ public class BeanUtilTest { person.setSubName("sub名字"); final Map map = BeanUtil.beanToMap(person, true, true); - Assertions.assertEquals("sub名字", map.get("sub_name")); + assertEquals("sub名字", map.get("sub_name")); } @Test @@ -242,7 +251,7 @@ public class BeanUtilTest { entry.setValue(entry.getKey() + "_" + entry.getValue()); return entry; })); - Assertions.assertEquals("subName_sub名字", map.get("subName")); + assertEquals("subName_sub名字", map.get("subName")); } @Test @@ -257,7 +266,7 @@ public class BeanUtilTest { person.setBooleanb(true); final Map map = BeanUtil.beanToMap(person); - Assertions.assertEquals("sub名字", map.get("aliasSubName")); + assertEquals("sub名字", map.get("aliasSubName")); } @Test @@ -269,11 +278,11 @@ public class BeanUtilTest { map.put("is_booleanb", true); final SubPersonWithAlias subPersonWithAlias = BeanUtil.toBean(map, SubPersonWithAlias.class); - Assertions.assertEquals("sub名字", subPersonWithAlias.getSubName()); + assertEquals("sub名字", subPersonWithAlias.getSubName()); // https://gitee.com/dromara/hutool/issues/I6H0XF // is_booleana并不匹配booleana字段 - Assertions.assertFalse(subPersonWithAlias.isBooleana()); + assertFalse(subPersonWithAlias.isBooleana()); Assertions.assertNull(subPersonWithAlias.getBooleanb()); } @@ -290,8 +299,8 @@ public class BeanUtilTest { person.setDate2(now.toLocalDate()); final Map map = BeanUtil.beanToMap(person, false, true); - Assertions.assertEquals(now, map.get("date")); - Assertions.assertEquals(now.toLocalDate(), map.get("date2")); + assertEquals(now, map.get("date")); + assertEquals(now.toLocalDate(), map.get("date2")); } @Test @@ -303,9 +312,9 @@ public class BeanUtilTest { person.setSubName("sub名字"); final Object name = BeanUtil.getProperty(person, "name"); - Assertions.assertEquals("测试A11", name); + assertEquals("测试A11", name); final Object subName = BeanUtil.getProperty(person, "subName"); - Assertions.assertEquals("sub名字", subName); + assertEquals("sub名字", subName); } @Test @@ -322,12 +331,12 @@ public class BeanUtilTest { for (final PropertyDescriptor propertyDescriptor : propertyDescriptors) { set.add(propertyDescriptor.getName()); } - Assertions.assertTrue(set.contains("age")); - Assertions.assertTrue(set.contains("id")); - Assertions.assertTrue(set.contains("name")); - Assertions.assertTrue(set.contains("openid")); - Assertions.assertTrue(set.contains("slow")); - Assertions.assertTrue(set.contains("subName")); + assertTrue(set.contains("age")); + assertTrue(set.contains("id")); + assertTrue(set.contains("name")); + assertTrue(set.contains("openid")); + assertTrue(set.contains("slow")); + assertTrue(set.contains("subName")); } @Test @@ -339,10 +348,10 @@ public class BeanUtilTest { person.setSubName("sub名字"); final SubPerson person1 = BeanUtil.copyProperties(person, SubPerson.class); - Assertions.assertEquals(14, person1.getAge()); - Assertions.assertEquals("11213232", person1.getOpenid()); - Assertions.assertEquals("测试A11", person1.getName()); - Assertions.assertEquals("sub名字", person1.getSubName()); + assertEquals(14, person1.getAge()); + assertEquals("11213232", person1.getOpenid()); + assertEquals("测试A11", person1.getName()); + assertEquals("sub名字", person1.getSubName()); } @Test @@ -384,12 +393,12 @@ public class BeanUtilTest { // 测试boolean参数值isXXX形式 final SubPerson p2 = new SubPerson(); BeanUtil.copyProperties(p1, p2); - Assertions.assertTrue(p2.getSlow()); + assertTrue(p2.getSlow()); // 测试boolean参数值非isXXX形式 final SubPerson2 p3 = new SubPerson2(); BeanUtil.copyProperties(p1, p3); - Assertions.assertTrue(p3.getSlow()); + assertTrue(p3.getSlow()); } @Test @@ -403,7 +412,7 @@ public class BeanUtilTest { // null值不覆盖目标属性 BeanUtil.copyProperties(p1, p2, CopyOptions.of().ignoreNullValue()); - Assertions.assertEquals("oldName", p2.getName()); + assertEquals("oldName", p2.getName()); // null覆盖目标属性 BeanUtil.copyProperties(p1, p2); @@ -420,9 +429,9 @@ public class BeanUtilTest { final Map map = MapUtil.newHashMap(); BeanUtil.copyProperties(p1, map); - Assertions.assertTrue((Boolean) map.get("slow")); - Assertions.assertEquals("测试", map.get("name")); - Assertions.assertEquals("sub测试", map.get("subName")); + assertTrue((Boolean) map.get("slow")); + assertEquals("测试", map.get("name")); + assertEquals("sub测试", map.get("subName")); } @Test @@ -435,9 +444,9 @@ public class BeanUtilTest { final Map map = MapUtil.newHashMap(); BeanUtil.copyProperties(p1, map); - Assertions.assertTrue((Boolean) map.get("isSlow")); - Assertions.assertEquals("测试", map.get("name")); - Assertions.assertEquals("sub测试", map.get("subName")); + assertTrue((Boolean) map.get("isSlow")); + assertEquals("测试", map.get("name")); + assertEquals("sub测试", map.get("subName")); } @Test @@ -449,8 +458,8 @@ public class BeanUtilTest { final Person person2 = BeanUtil.trimStrFields(person); // 是否改变原对象 - Assertions.assertEquals("张三", person.getName()); - Assertions.assertEquals("张三", person2.getName()); + assertEquals("张三", person.getName()); + assertEquals("张三", person2.getName()); } // ----------------------------------------------------------------------------------------------------------------- @@ -535,9 +544,9 @@ public class BeanUtilTest { final SubPersonWithOverlayTransientField dest = new SubPersonWithOverlayTransientField(); BeanUtil.copyProperties(source, dest); - Assertions.assertEquals(source.getName(), dest.getName()); - Assertions.assertEquals(source.getAge(), dest.getAge()); - Assertions.assertEquals(source.getOpenid(), dest.getOpenid()); + assertEquals(source.getName(), dest.getName()); + assertEquals(source.getAge(), dest.getAge()); + assertEquals(source.getOpenid(), dest.getOpenid()); } @Test @@ -568,8 +577,8 @@ public class BeanUtilTest { info.setCode("123"); final HllFoodEntity entity = new HllFoodEntity(); BeanUtil.copyProperties(info, entity); - Assertions.assertEquals(info.getBookID(), entity.getBookId()); - Assertions.assertEquals(info.getCode(), entity.getCode2()); + assertEquals(info.getBookID(), entity.getBookId()); + assertEquals(info.getCode(), entity.getCode2()); } @Test @@ -578,7 +587,7 @@ public class BeanUtilTest { info.setBookID("0"); info.setCode("123"); final Food newFood = BeanUtil.copyProperties(info, Food.class, "code"); - Assertions.assertEquals(info.getBookID(), newFood.getBookID()); + assertEquals(info.getBookID(), newFood.getBookID()); Assertions.assertNull(newFood.getCode()); } @@ -597,9 +606,9 @@ public class BeanUtilTest { final Map map = MapUtil.newHashMap(); BeanUtil.copyProperties(p1, map, CopyOptions.of().setIgnoreNullValue(true)); - Assertions.assertTrue((Boolean) map.get("isSlow")); - Assertions.assertEquals("测试", map.get("name")); - Assertions.assertFalse(map.containsKey("subName")); + assertTrue((Boolean) map.get("isSlow")); + assertEquals("测试", map.get("name")); + assertFalse(map.containsKey("subName")); } @Test @@ -610,7 +619,7 @@ public class BeanUtilTest { final Food newFood = new Food(); final CopyOptions copyOptions = CopyOptions.of().setPropertiesFilter((f, v) -> !(v instanceof CharSequence) || StrUtil.isNotBlank(v.toString())); BeanUtil.copyProperties(info, newFood, copyOptions); - Assertions.assertEquals(info.getBookID(), newFood.getBookID()); + assertEquals(info.getBookID(), newFood.getBookID()); Assertions.assertNull(newFood.getCode()); } @@ -652,7 +661,7 @@ public class BeanUtilTest { public void setPropertiesTest() { final Map resultMap = MapUtil.newHashMap(); BeanUtil.setProperty(resultMap, "codeList[0].name", "张三"); - Assertions.assertEquals("{codeList=[{name=张三}]}", resultMap.toString()); + assertEquals("{codeList=[{name=张三}]}", resultMap.toString()); } @Test @@ -663,7 +672,7 @@ public class BeanUtilTest { final Station station2 = new Station(); BeanUtil.copyProperties(station, station2); - Assertions.assertEquals(Long.valueOf(123456L), station2.getId()); + assertEquals(Long.valueOf(123456L), station2.getId()); } static class Station extends Tree {} @@ -689,10 +698,10 @@ public class BeanUtilTest { final List studentList = ListUtil.view(student, student2); final List people = BeanUtil.copyToList(studentList, Person.class); - Assertions.assertEquals(studentList.size(), people.size()); + assertEquals(studentList.size(), people.size()); for (int i = 0; i < studentList.size(); i++) { - Assertions.assertEquals(studentList.get(i).getName(), people.get(i).getName()); - Assertions.assertEquals(studentList.get(i).getAge(), people.get(i).getAge()); + assertEquals(studentList.get(i).getName(), people.get(i).getName()); + assertEquals(studentList.get(i).getAge(), people.get(i).getAge()); } } @@ -712,11 +721,11 @@ public class BeanUtilTest { final List studentList = ListUtil.view(student, student2); final List people = BeanUtil.copyToList(studentList, Person.class, CopyOptions.of().setFieldMapping(MapUtil.of("no", "openid"))); - Assertions.assertEquals(studentList.size(), people.size()); + assertEquals(studentList.size(), people.size()); for (int i = 0; i < studentList.size(); i++) { - Assertions.assertEquals(studentList.get(i).getName(), people.get(i).getName()); - Assertions.assertEquals(studentList.get(i).getAge(), people.get(i).getAge()); - Assertions.assertEquals(studentList.get(i).getNo().toString(), people.get(i).getOpenid()); + assertEquals(studentList.get(i).getName(), people.get(i).getName()); + assertEquals(studentList.get(i).getAge(), people.get(i).getAge()); + assertEquals(studentList.get(i).getNo().toString(), people.get(i).getOpenid()); } } @@ -741,7 +750,7 @@ public class BeanUtilTest { } return entry; }); - Assertions.assertFalse(f.containsKey(null)); + assertFalse(f.containsKey(null)); } @Data @@ -772,65 +781,65 @@ public class BeanUtilTest { final BeanPath beanPath = BeanPath.of("testPojo2List.age"); final Object o = beanPath.getValue(testPojo); - Assertions.assertEquals(Integer.valueOf(2), ArrayUtil.get(o, 0)); - Assertions.assertEquals(Integer.valueOf(3), ArrayUtil.get(o, 1)); + assertEquals(Integer.valueOf(2), ArrayUtil.get(o, 0)); + assertEquals(Integer.valueOf(3), ArrayUtil.get(o, 1)); } @Test void hasNullFieldTest() { - Assertions.assertTrue(BeanUtil.hasNullField(null)); + assertTrue(BeanUtil.hasNullField(null)); final TestPojo testPojo = new TestPojo(); - Assertions.assertTrue(BeanUtil.hasNullField(testPojo)); + assertTrue(BeanUtil.hasNullField(testPojo)); testPojo.setName("test"); - Assertions.assertTrue(BeanUtil.hasNullField(testPojo)); + assertTrue(BeanUtil.hasNullField(testPojo)); // 忽略testPojo2List,则只剩下name属性,非空,返回false - Assertions.assertFalse(BeanUtil.hasNullField(testPojo, "testPojo2List")); + assertFalse(BeanUtil.hasNullField(testPojo, "testPojo2List")); testPojo.setTestPojo2List(new TestPojo2[0]); // 所有字段都有值 - Assertions.assertFalse(BeanUtil.hasNullField(testPojo)); + assertFalse(BeanUtil.hasNullField(testPojo)); } @Test void hasEmptyFieldTest() { - Assertions.assertTrue(BeanUtil.hasEmptyField(null)); + assertTrue(BeanUtil.hasEmptyField(null)); final TestPojo testPojo = new TestPojo(); - Assertions.assertTrue(BeanUtil.hasEmptyField(testPojo)); + assertTrue(BeanUtil.hasEmptyField(testPojo)); testPojo.setName("test"); - Assertions.assertTrue(BeanUtil.hasEmptyField(testPojo)); + assertTrue(BeanUtil.hasEmptyField(testPojo)); // 忽略testPojo2List,则只剩下name属性,非空,返回false - Assertions.assertFalse(BeanUtil.hasEmptyField(testPojo, "testPojo2List")); + assertFalse(BeanUtil.hasEmptyField(testPojo, "testPojo2List")); testPojo.setTestPojo2List(new TestPojo2[0]); // 所有字段都有值 - Assertions.assertFalse(BeanUtil.hasEmptyField(testPojo)); + assertFalse(BeanUtil.hasEmptyField(testPojo)); // 给空字段值 testPojo.setName(""); - Assertions.assertTrue(BeanUtil.hasEmptyField(testPojo)); + assertTrue(BeanUtil.hasEmptyField(testPojo)); } @Test void isEmptyTest() { - Assertions.assertTrue(BeanUtil.isEmpty(null)); + assertTrue(BeanUtil.isEmpty(null)); final TestPojo testPojo = new TestPojo(); - Assertions.assertTrue(BeanUtil.isEmpty(testPojo)); + assertTrue(BeanUtil.isEmpty(testPojo)); testPojo.setName("test"); - Assertions.assertFalse(BeanUtil.isEmpty(testPojo)); + assertFalse(BeanUtil.isEmpty(testPojo)); // 忽略name属性判断 - Assertions.assertTrue(BeanUtil.isEmpty(testPojo, "name")); + assertTrue(BeanUtil.isEmpty(testPojo, "name")); testPojo.setTestPojo2List(new TestPojo2[0]); // 所有字段都有值 - Assertions.assertFalse(BeanUtil.isEmpty(testPojo)); + assertFalse(BeanUtil.isEmpty(testPojo)); } @Data @@ -877,10 +886,10 @@ public class BeanUtilTest { final ChildVo2 childVo2 = new ChildVo2(); BeanUtil.copyProperties(childVo1, childVo2, copyOptions); - Assertions.assertEquals(childVo1.getChild_address(), childVo2.getChildAddress()); - Assertions.assertEquals(childVo1.getChild_name(), childVo2.getChildName()); - Assertions.assertEquals(childVo1.getChild_father_name(), childVo2.getChildFatherName()); - Assertions.assertEquals(childVo1.getChild_mother_name(), childVo2.getChildMotherName()); + assertEquals(childVo1.getChild_address(), childVo2.getChildAddress()); + assertEquals(childVo1.getChild_name(), childVo2.getChildName()); + assertEquals(childVo1.getChild_father_name(), childVo2.getChildFatherName()); + assertEquals(childVo1.getChild_mother_name(), childVo2.getChildMotherName()); } @Data @@ -957,13 +966,13 @@ public class BeanUtilTest { return map.containsKey(key); } }, copyOptions); - Assertions.assertEquals("123", pojo.getName()); + assertEquals("123", pojo.getName()); } @Test public void hasGetterTest() { // https://gitee.com/dromara/hutool/issues/I6M7Z7 final boolean b = BeanUtil.hasGetter(Object.class); - Assertions.assertFalse(b); + assertFalse(b); } } diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/date/format/parser/RegexDateParserTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/date/format/parser/RegexDateParserTest.java index a0141ac4b..a8d5e00ea 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/date/format/parser/RegexDateParserTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/date/format/parser/RegexDateParserTest.java @@ -9,6 +9,7 @@ import java.util.Date; public class RegexDateParserTest { @Test void parsePureTest() { + // yyyyMMdd final RegexDateParser parser = RegexDateParser.of("^(?\\d{4})(?\\d{2})(?\\d{2})$"); final Date parse = parser.parse("20220101"); Assertions.assertEquals("2022-01-01", DateUtil.date(parse).toDateStr());