From 0cd79bcbfdee8adbc6ac7bae3db38f604cf746a7 Mon Sep 17 00:00:00 2001 From: Looly Date: Sun, 22 Mar 2020 16:45:25 +0800 Subject: [PATCH] fix bugs --- CHANGELOG.md | 2 + .../java/cn/hutool/core/bean/BeanUtil.java | 16 +++++++- .../copier/provider/BeanValueProvider.java | 8 ++-- .../cn/hutool/core/bean/BeanUtilTest.java | 39 +++++++++++++----- .../src/main/java/cn/hutool/json/XML.java | 40 +++++++++---------- .../src/test/java/cn/hutool/json/XMLTest.java | 15 +++++++ 6 files changed, 84 insertions(+), 36 deletions(-) create mode 100644 hutool-json/src/test/java/cn/hutool/json/XMLTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index a74bde6e0..4b4c49518 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ * 【core 】 Tree增加getParent方法,可以获取父节点,抽象Node接口 * 【core 】 增加社会信用代码工具CreditCodeUtil(pr#112@Gitee) * 【core 】 ChineseDate增加构造重载,增加toStringNormal(issue#792@Github) +* 【core 】 BeanUtil.toBean增加重载(issue#797@Github) ### Bug修复 * 【core 】 修复TypeUtil无法获取泛型接口的泛型参数问题(issue#I1BRFI@Gitee) @@ -23,6 +24,7 @@ * 【core 】 修复BeanPath从Map取值为空的问题(issue#790@Github) * 【poi 】 修复添加图片尺寸的单位问题(issue#I1C2ER@Gitee) * 【setting】 修复getStr中逻辑问题(pr#113@Gitee) +* 【json 】 修复JSONUtil.toXml汉字被编码的问题(pr#795@Gitee) ------------------------------------------------------------------------------------------------------------- ## 5.2.3 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 f258f9344..4d007271d 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 @@ -444,8 +444,22 @@ public class BeanUtil { * @since 4.1.20 */ public static T toBean(Object source, Class clazz) { + return toBean(source, clazz, null); + } + + /** + * 对象或Map转Bean + * + * @param 转换的Bean类型 + * @param source Bean对象或Map + * @param clazz 目标的Bean类型 + * @param options 属性拷贝选项 + * @return Bean对象 + * @since 5.2.4 + */ + public static T toBean(Object source, Class clazz, CopyOptions options) { final T target = ReflectUtil.newInstance(clazz); - copyProperties(source, target); + copyProperties(source, target, options); return target; } diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/copier/provider/BeanValueProvider.java b/hutool-core/src/main/java/cn/hutool/core/bean/copier/provider/BeanValueProvider.java index 762b4defa..fbc410b2d 100644 --- a/hutool-core/src/main/java/cn/hutool/core/bean/copier/provider/BeanValueProvider.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/copier/provider/BeanValueProvider.java @@ -1,15 +1,15 @@ package cn.hutool.core.bean.copier.provider; -import java.lang.reflect.Method; -import java.lang.reflect.Type; -import java.util.Map; - import cn.hutool.core.bean.BeanDesc.PropDesc; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.copier.ValueProvider; import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.util.StrUtil; +import java.lang.reflect.Method; +import java.lang.reflect.Type; +import java.util.Map; + /** * Bean的值提供者 * 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 b12874e72..1c8676a20 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 @@ -23,7 +23,6 @@ import java.util.UUID; * Bean工具单元测试 * * @author Looly - * */ public class BeanUtilTest { @@ -42,10 +41,10 @@ public class BeanUtilTest { @Override public Object value(String key, Type valueType) { switch (key) { - case "name": - return "张三"; - case "age": - return 18; + case "name": + return "张三"; + case "age": + return 18; } return null; } @@ -203,17 +202,17 @@ public class BeanUtilTest { } @Test - public void copyProperties(){ + public void copyProperties() { SubPerson person = new SubPerson(); person.setAge(14); person.setOpenid("11213232"); person.setName("测试A11"); person.setSubName("sub名字"); SubPerson person1 = BeanUtil.copyProperties(person, SubPerson.class); - Assert.assertEquals(14,person1.getAge()); - Assert.assertEquals("11213232",person1.getOpenid()); - Assert.assertEquals("测试A11",person1.getName()); - Assert.assertEquals("sub名字",person1.getSubName()); + Assert.assertEquals(14, person1.getAge()); + Assert.assertEquals("11213232", person1.getOpenid()); + Assert.assertEquals("测试A11", person1.getName()); + Assert.assertEquals("sub名字", person1.getSubName()); } @Test @@ -319,4 +318,24 @@ public class BeanUtilTest { public int age; public String openid; } + + @Test + public void beanToBeanTest(){ + // 复现对象无getter方法导致报错的问题 + Page page1=new Page(); + BeanUtil.toBean(page1, Page.class, CopyOptions.create().setIgnoreNullValue(true)); + } + + public static class Page { + private boolean optimizeCountSql = true; + + public boolean optimizeCountSql() { + return optimizeCountSql; + } + + public Page setOptimizeCountSql(boolean optimizeCountSql) { + this.optimizeCountSql = optimizeCountSql; + return this; + } + } } diff --git a/hutool-json/src/main/java/cn/hutool/json/XML.java b/hutool-json/src/main/java/cn/hutool/json/XML.java index b76ff6a8c..08ccb810a 100644 --- a/hutool-json/src/main/java/cn/hutool/json/XML.java +++ b/hutool-json/src/main/java/cn/hutool/json/XML.java @@ -1,11 +1,11 @@ package cn.hutool.json; -import java.util.Iterator; - import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.CharUtil; +import cn.hutool.core.util.EscapeUtil; import cn.hutool.core.util.StrUtil; -import cn.hutool.core.util.XmlUtil; + +import java.util.Iterator; /** * 提供静态方法在XML和JSONObject之间转换 @@ -299,11 +299,11 @@ public class XML { if (i > 0) { sb.append('\n'); } - sb.append(XmlUtil.escape(val.toString())); + sb.append(EscapeUtil.escapeHtml4(val.toString())); i++; } } else { - sb.append(XmlUtil.escape(value.toString())); + sb.append(EscapeUtil.escapeHtml4(value.toString())); } // Emit an array of similar keys @@ -345,24 +345,22 @@ public class XML { } - if (object != null) { - if (object.getClass().isArray()) { - object = new JSONArray(object); - } - - if (object instanceof JSONArray) { - ja = (JSONArray) object; - for (Object val : ja) { - // XML does not have good support for arrays. If an array - // appears in a place where XML is lacking, synthesize an - // element. - sb.append(toXml(val, tagName == null ? "array" : tagName)); - } - return sb.toString(); - } + if (object.getClass().isArray()) { + object = new JSONArray(object); } - String string = (object == null) ? StrUtil.NULL : XmlUtil.escape(object.toString()); + if (object instanceof JSONArray) { + ja = (JSONArray) object; + for (Object val : ja) { + // XML does not have good support for arrays. If an array + // appears in a place where XML is lacking, synthesize an + // element. + sb.append(toXml(val, tagName == null ? "array" : tagName)); + } + return sb.toString(); + } + + String string = EscapeUtil.escapeHtml4(object.toString()); return (tagName == null) ? "\"" + string + "\"" : (string.length() == 0) ? "<" + tagName + "/>" : "<" + tagName + ">" + string + ""; diff --git a/hutool-json/src/test/java/cn/hutool/json/XMLTest.java b/hutool-json/src/test/java/cn/hutool/json/XMLTest.java new file mode 100644 index 000000000..8de0efaa1 --- /dev/null +++ b/hutool-json/src/test/java/cn/hutool/json/XMLTest.java @@ -0,0 +1,15 @@ +package cn.hutool.json; + +import org.junit.Assert; +import org.junit.Test; + +public class XMLTest { + + @SuppressWarnings("ConstantConditions") + @Test + public void toXmlTest(){ + final JSONObject put = JSONUtil.createObj().put("aaa", "你好").put("键2", "test"); + final String s = JSONUtil.toXmlStr(put); + Assert.assertEquals("你好<键2>test", s); + } +}