This commit is contained in:
Looly 2020-03-22 16:45:25 +08:00
parent 7c05a71159
commit 0cd79bcbfd
6 changed files with 84 additions and 36 deletions

View File

@ -16,6 +16,7 @@
* 【core 】 Tree增加getParent方法可以获取父节点抽象Node接口
* 【core 】 增加社会信用代码工具CreditCodeUtilpr#112@Gitee
* 【core 】 ChineseDate增加构造重载增加toStringNormalissue#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

View File

@ -444,8 +444,22 @@ public class BeanUtil {
* @since 4.1.20
*/
public static <T> T toBean(Object source, Class<T> clazz) {
return toBean(source, clazz, null);
}
/**
* 对象或Map转Bean
*
* @param <T> 转换的Bean类型
* @param source Bean对象或Map
* @param clazz 目标的Bean类型
* @param options 属性拷贝选项
* @return Bean对象
* @since 5.2.4
*/
public static <T> T toBean(Object source, Class<T> clazz, CopyOptions options) {
final T target = ReflectUtil.newInstance(clazz);
copyProperties(source, target);
copyProperties(source, target, options);
return target;
}

View File

@ -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的值提供者
*

View File

@ -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;
}
}
}

View File

@ -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
// <array> 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
// <array> 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 + "</" + tagName + ">";

View File

@ -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("<aaa>你好</aaa><键2>test</键2>", s);
}
}