diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2ab5210fd..d63a06def 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,8 @@
## 5.0.6
### 新特性
+* 【setting】 toBean改为泛型,增加class参数重载(pr#80@Gitee)
+* 【core】 XmlUtil使用JDK默认的实现,避免第三方实现导致的问题(issue#I14ZS1@Gitee)
### Bug修复
* 【core】 修复DateUtil.format使用DateTime时区失效问题(issue#I150I7@Gitee)
diff --git a/hutool-core/src/main/java/cn/hutool/core/util/XmlUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/XmlUtil.java
index 257db6a20..870aafe1d 100644
--- a/hutool-core/src/main/java/cn/hutool/core/util/XmlUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/util/XmlUtil.java
@@ -56,11 +56,23 @@ public class XmlUtil {
/**
* 在XML中无效的字符 正则
*/
- public final static String INVALID_REGEX = "[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f]";
+ public static final String INVALID_REGEX = "[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f]";
/**
* XML格式化输出默认缩进量
*/
- public final static int INDENT_DEFAULT = 2;
+ public static final int INDENT_DEFAULT = 2;
+
+ /**
+ * 默认的DocumentBuilderFactory实现
+ */
+ private static String defaultDocumentBuilderFactory = "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl";
+
+ /**
+ * 禁用默认的DocumentBuilderFactory,禁用后如果有第三方的实现(如oracle的xdb包中的xmlparse),将会自动加载实现。
+ */
+ synchronized public static void disableDefaultDocumentBuilderFactory(){
+ defaultDocumentBuilderFactory = null;
+ }
// -------------------------------------------------------------------------------------- Read
@@ -387,16 +399,34 @@ public class XmlUtil {
* @since 4.1.2
*/
public static DocumentBuilder createDocumentBuilder() {
- final DocumentBuilderFactory dbf = disableXXE(DocumentBuilderFactory.newInstance());
DocumentBuilder builder;
try {
- builder = dbf.newDocumentBuilder();
+ builder = createDocumentBuilderFactory().newDocumentBuilder();
} catch (Exception e) {
throw new UtilException(e, "Create xml document error!");
}
return builder;
}
+ /**
+ * 创建{@link DocumentBuilderFactory}
+ *
+ * 默认使用"com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl"
+ * 如果使用第三方实现,请调用{@link #disableDefaultDocumentBuilderFactory()}
+ *
+ *
+ * @return {@link DocumentBuilderFactory}
+ */
+ public static DocumentBuilderFactory createDocumentBuilderFactory(){
+ final DocumentBuilderFactory factory;
+ if(StrUtil.isNotEmpty(defaultDocumentBuilderFactory)){
+ factory = DocumentBuilderFactory.newInstance(defaultDocumentBuilderFactory, null);
+ } else{
+ factory = DocumentBuilderFactory.newInstance();
+ }
+ return disableXXE(factory);
+ }
+
/**
* 创建XML文档
* 创建的XML默认是utf8编码,修改编码的过程是在toStr和toFile方法里,即XML在转为文本的时候才定义编码
diff --git a/hutool-setting/src/main/java/cn/hutool/setting/AbsSetting.java b/hutool-setting/src/main/java/cn/hutool/setting/AbsSetting.java
index 85035ba24..e93338e23 100644
--- a/hutool-setting/src/main/java/cn/hutool/setting/AbsSetting.java
+++ b/hutool-setting/src/main/java/cn/hutool/setting/AbsSetting.java
@@ -8,25 +8,29 @@ import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.bean.copier.ValueProvider;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.getter.OptNullBasicTypeFromStringGetter;
+import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.log.Log;
import cn.hutool.log.LogFactory;
/**
* Setting抽象类
- *
- * @author Looly
*
+ * @author Looly
*/
-public abstract class AbsSetting extends OptNullBasicTypeFromStringGetter implements Serializable{
+public abstract class AbsSetting extends OptNullBasicTypeFromStringGetter implements Serializable {
private static final long serialVersionUID = 6200156302595905863L;
private final static Log log = LogFactory.get();
- /** 数组类型值默认分隔符 */
+ /**
+ * 数组类型值默认分隔符
+ */
public final static String DEFAULT_DELIMITER = ",";
- /** 默认分组 */
+ /**
+ * 默认分组
+ */
public final static String DEFAULT_GROUP = StrUtil.EMPTY;
-
+
@Override
public String getStr(String key, String defaultValue) {
return getStr(key, DEFAULT_GROUP, defaultValue);
@@ -34,9 +38,9 @@ public abstract class AbsSetting extends OptNullBasicTypeFromStringGetter
* 只支持基本类型的转换
- *
+ *
* @param group 分组
- * @param bean Bean对象
+ * @param bean Bean对象
* @return Bean
*/
public T toBean(final String group, T bean) {
- return BeanUtil.fillBean(bean, new ValueProvider(){
+ return BeanUtil.fillBean(bean, new ValueProvider() {
@Override
public Object value(String key, Type valueType) {
@@ -279,11 +290,38 @@ public abstract class AbsSetting extends OptNullBasicTypeFromStringGetter
* 只支持基本类型的转换
- *
+ *
+ * @param group 分组
+ * @param beanClass Bean类型
+ * @return Bean
+ * @since 5.0.6
+ */
+ public T toBean(String group, Class beanClass) {
+ return toBean(group, ReflectUtil.newInstance(beanClass));
+ }
+
+ /**
+ * 将setting中的键值关系映射到对象中,原理是调用对象对应的set方法
+ * 只支持基本类型的转换
+ *
+ * @param bean类型
* @param bean Bean
* @return Bean
*/
public T toBean(T bean) {
return toBean(null, bean);
}
+
+ /**
+ * 将setting中的键值关系映射到对象中,原理是调用对象对应的set方法
+ * 只支持基本类型的转换
+ *
+ * @param bean类型
+ * @param beanClass Bean类型
+ * @return Bean
+ * @since 5.0.6
+ */
+ public T toBean(Class beanClass) {
+ return toBean(null, beanClass);
+ }
}