From e9e4a491322178c7a1fa8a39d83201bd07bfaace Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 11 Jul 2024 12:43:27 +0800 Subject: [PATCH] =?UTF-8?q?Converter=E8=BD=AC=E6=8D=A2=E8=A7=84=E5=88=99?= =?UTF-8?q?=E5=8F=98=E6=9B=B4=EF=BC=8C=E7=A9=BA=E5=AF=B9=E8=B1=A1=E3=80=81?= =?UTF-8?q?=E7=A9=BA=E5=80=BC=E8=BD=AC=E4=B8=BABean=E6=97=B6=EF=BC=8C?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E9=BB=98=E8=AE=A4=E5=AF=B9=E8=B1=A1=EF=BC=8C?= =?UTF-8?q?=E8=80=8C=E9=9D=9Enul?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/convert/CompositeConverter.java | 7 +++++ .../core/convert/CompositeConverterTest.java | 26 ++++++++++++++----- .../hutool/core/util/Issue3136Test.java | 2 +- .../hutool/json/convert/JSONConverter.java | 6 +++++ .../dromara/hutool/json/Issue2564Test.java | 20 ++++++++------ .../dromara/hutool/json/Issue3649Test.java | 16 ++++++++++++ 6 files changed, 61 insertions(+), 16 deletions(-) create mode 100644 hutool-json/src/test/java/org/dromara/hutool/json/Issue3649Test.java diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/convert/CompositeConverter.java b/hutool-core/src/main/java/org/dromara/hutool/core/convert/CompositeConverter.java index 1e9ad3f56..6f428dc8f 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/convert/CompositeConverter.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/convert/CompositeConverter.java @@ -16,6 +16,7 @@ import org.dromara.hutool.core.bean.BeanUtil; import org.dromara.hutool.core.bean.RecordUtil; import org.dromara.hutool.core.convert.impl.*; import org.dromara.hutool.core.lang.Opt; +import org.dromara.hutool.core.reflect.ConstructorUtil; import org.dromara.hutool.core.reflect.TypeReference; import org.dromara.hutool.core.reflect.TypeUtil; import org.dromara.hutool.core.reflect.kotlin.KClassUtil; @@ -258,6 +259,12 @@ public class CompositeConverter extends RegisterConverter { return (T) ClassConverter.INSTANCE.convert(type, value); } + // 空值转空Bean + if(ObjUtil.isEmpty(value)){ + // issue#3649 空值转空对象,则直接实例化 + return ConstructorUtil.newInstanceIfPossible(rowType); + } + // 表示非需要特殊转换的对象 return null; } diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/convert/CompositeConverterTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/convert/CompositeConverterTest.java index a30d7104b..bbdac804d 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/convert/CompositeConverterTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/convert/CompositeConverterTest.java @@ -12,40 +12,52 @@ package org.dromara.hutool.core.convert; -import org.junit.jupiter.api.Assertions; +import lombok.Data; import org.junit.jupiter.api.Test; import java.lang.reflect.Type; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + /** * ConverterRegistry 单元测试 - * @author Looly * + * @author Looly */ public class CompositeConverterTest { + @Test + void convertEmptyTest() { + final Object convert = CompositeConverter.getInstance().convert(EmptyBean.class, ""); + assertNotNull(convert); + assertEquals(new EmptyBean(), convert); + } + + @Data + public static class EmptyBean {} @Test public void getConverterTest() { final Converter converter = CompositeConverter.getInstance().getConverter(CharSequence.class, false); - Assertions.assertNotNull(converter); + assertNotNull(converter); } @Test - public void customTest(){ + public void customTest() { final int a = 454553; final CompositeConverter compositeConverter = CompositeConverter.getInstance(); CharSequence result = (CharSequence) compositeConverter.convert(CharSequence.class, a); - Assertions.assertEquals("454553", result); + assertEquals("454553", result); //此处做为示例自定义CharSequence转换,因为Hutool中已经提供CharSequence转换,请尽量不要替换 //替换可能引发关联转换异常(例如覆盖CharSequence转换会影响全局) compositeConverter.putCustom(CharSequence.class, new CustomConverter()); result = (CharSequence) compositeConverter.convert(CharSequence.class, a); - Assertions.assertEquals("Custom: 454553", result); + assertEquals("Custom: 454553", result); } - public static class CustomConverter implements Converter{ + public static class CustomConverter implements Converter { @Override public Object convert(final Type targetType, final Object value) throws ConvertException { return "Custom: " + value.toString(); diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/util/Issue3136Test.java b/hutool-core/src/test/java/org/dromara/hutool/core/util/Issue3136Test.java index cf85ad660..b4383bdbd 100755 --- a/hutool-core/src/test/java/org/dromara/hutool/core/util/Issue3136Test.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/util/Issue3136Test.java @@ -34,7 +34,7 @@ public class Issue3136Test { final SmsRes smsRes = XmlUtil.xmlToBean(XmlUtil.parseXml(xmlStr).getDocumentElement(), SmsRes.class); Assertions.assertEquals("02", smsRes.getCode()); - Assertions.assertNull(smsRes.getMessage()); + Assertions.assertEquals(new Message(), smsRes.getMessage()); } @Data diff --git a/hutool-json/src/main/java/org/dromara/hutool/json/convert/JSONConverter.java b/hutool-json/src/main/java/org/dromara/hutool/json/convert/JSONConverter.java index 2b6c1eb9f..db44bde4f 100644 --- a/hutool-json/src/main/java/org/dromara/hutool/json/convert/JSONConverter.java +++ b/hutool-json/src/main/java/org/dromara/hutool/json/convert/JSONConverter.java @@ -293,6 +293,12 @@ public class JSONConverter implements Converter, Serializable { return (T) RecordConverter.INSTANCE.convert(type, value); } + // 空值转空Bean + if(ObjUtil.isEmpty(value)){ + // issue#3649 空值转空对象,则直接实例化 + return ConstructorUtil.newInstanceIfPossible(rowType); + } + // 表示非需要特殊转换的对象 return null; } diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/Issue2564Test.java b/hutool-json/src/test/java/org/dromara/hutool/json/Issue2564Test.java index d759d1ccb..2104d5458 100644 --- a/hutool-json/src/test/java/org/dromara/hutool/json/Issue2564Test.java +++ b/hutool-json/src/test/java/org/dromara/hutool/json/Issue2564Test.java @@ -12,8 +12,7 @@ package org.dromara.hutool.json; -import lombok.Getter; -import lombok.Setter; +import lombok.Data; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -23,14 +22,19 @@ public class Issue2564Test { * 实力类 没有get set方法,不能被认为是一个bean */ @Test() - public void emptyToBeanTest(){ - final String x = "{}"; - final A a = JSONUtil.toBean(x, JSONConfig.of().setIgnoreError(true), A.class); + public void emptyToBeanTest() { + // 空对象转为一个空Bean,返回默认空实例 + String x = "{}" ; + A a = JSONUtil.toBean(x, JSONConfig.of().setIgnoreError(true), A.class); + Assertions.assertEquals(new A(), a); + + // 非空对象转为一个空bean,转换失败 + x = "{\"a\": 1}" ; + a = JSONUtil.toBean(x, JSONConfig.of().setIgnoreError(true), A.class); Assertions.assertNull(a); } - @Getter - @Setter - public static class A{ + @Data + public static class A { } } diff --git a/hutool-json/src/test/java/org/dromara/hutool/json/Issue3649Test.java b/hutool-json/src/test/java/org/dromara/hutool/json/Issue3649Test.java new file mode 100644 index 000000000..3df20346a --- /dev/null +++ b/hutool-json/src/test/java/org/dromara/hutool/json/Issue3649Test.java @@ -0,0 +1,16 @@ +package org.dromara.hutool.json; + +import lombok.Data; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class Issue3649Test { + @Test + void toEmptyBeanTest() { + final Object bean = JSONUtil.toBean("{}", JSONConfig.of().setIgnoreError(false), EmptyBean.class); + Assertions.assertEquals(new EmptyBean(), bean); + } + + @Data + public static class EmptyBean {} +}