浏览代码

use defaut doc impl

Looly 6 年之前
父节点
当前提交
61c06d3971

+ 2 - 0
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)

+ 34 - 4
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,10 +399,9 @@ 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!");
 		}
@@ -398,6 +409,25 @@ public class XmlUtil {
 	}
 
 	/**
+	 * 创建{@link DocumentBuilderFactory}
+	 * <p>
+	 *     默认使用"com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl"<br>
+	 *     如果使用第三方实现,请调用{@link #disableDefaultDocumentBuilderFactory()}
+	 * </p>
+	 *
+	 * @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文档<br>
 	 * 创建的XML默认是utf8编码,修改编码的过程是在toStr和toFile方法里,即XML在转为文本的时候才定义编码
 	 *

+ 86 - 48
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<String> implements Serializable{
+public abstract class AbsSetting extends OptNullBasicTypeFromStringGetter<String> 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<String
 
 	/**
 	 * 获得字符串类型值
-	 * 
-	 * @param key KEY
-	 * @param group 分组
+	 *
+	 * @param key          KEY
+	 * @param group        分组
 	 * @param defaultValue 默认值
 	 * @return 值或默认值
 	 */
@@ -50,17 +54,18 @@ public abstract class AbsSetting extends OptNullBasicTypeFromStringGetter<String
 
 	/**
 	 * 获得指定分组的键对应值
-	 * 
-	 * @param key 键
+	 *
+	 * @param key   
 	 * @param group 分组
 	 * @return 值
 	 */
 	public abstract String getByGroup(String key, String group);
 
 	// --------------------------------------------------------------- Get
+
 	/**
 	 * 带有日志提示的get,如果没有定义指定的KEY,则打印debug日志
-	 * 
+	 *
 	 * @param key 键
 	 * @return 值
 	 */
@@ -74,8 +79,8 @@ public abstract class AbsSetting extends OptNullBasicTypeFromStringGetter<String
 
 	/**
 	 * 带有日志提示的get,如果没有定义指定的KEY,则打印debug日志
-	 * 
-	 * @param key 键
+	 *
+	 * @param key   
 	 * @param group 分组
 	 * @return 值
 	 */
@@ -88,9 +93,10 @@ public abstract class AbsSetting extends OptNullBasicTypeFromStringGetter<String
 	}
 
 	// --------------------------------------------------------------- Get string array
+
 	/**
 	 * 获得数组型
-	 * 
+	 *
 	 * @param key 属性名
 	 * @return 属性值
 	 */
@@ -100,8 +106,8 @@ public abstract class AbsSetting extends OptNullBasicTypeFromStringGetter<String
 
 	/**
 	 * 获得数组型
-	 * 
-	 * @param key 属性名
+	 *
+	 * @param key          属性名
 	 * @param defaultValue 默认的值
 	 * @return 属性值
 	 */
@@ -116,8 +122,8 @@ public abstract class AbsSetting extends OptNullBasicTypeFromStringGetter<String
 
 	/**
 	 * 获得数组型
-	 * 
-	 * @param key 属性名
+	 *
+	 * @param key   属性名
 	 * @param group 分组名
 	 * @return 属性值
 	 */
@@ -127,9 +133,9 @@ public abstract class AbsSetting extends OptNullBasicTypeFromStringGetter<String
 
 	/**
 	 * 获得数组型
-	 * 
-	 * @param key 属性名
-	 * @param group 分组名
+	 *
+	 * @param key       属性名
+	 * @param group     分组名
 	 * @param delimiter 分隔符
 	 * @return 属性值
 	 */
@@ -142,10 +148,11 @@ public abstract class AbsSetting extends OptNullBasicTypeFromStringGetter<String
 	}
 
 	// --------------------------------------------------------------- Get int
+
 	/**
 	 * 获取数字型型属性值
-	 * 
-	 * @param key 属性名
+	 *
+	 * @param key   属性名
 	 * @param group 分组名
 	 * @return 属性值
 	 */
@@ -155,9 +162,9 @@ public abstract class AbsSetting extends OptNullBasicTypeFromStringGetter<String
 
 	/**
 	 * 获取数字型型属性值
-	 * 
-	 * @param key 属性名
-	 * @param group 分组名
+	 *
+	 * @param key          属性名
+	 * @param group        分组名
 	 * @param defaultValue 默认值
 	 * @return 属性值
 	 */
@@ -166,10 +173,11 @@ public abstract class AbsSetting extends OptNullBasicTypeFromStringGetter<String
 	}
 
 	// --------------------------------------------------------------- Get bool
+
 	/**
 	 * 获取波尔型属性值
-	 * 
-	 * @param key 属性名
+	 *
+	 * @param key   属性名
 	 * @param group 分组名
 	 * @return 属性值
 	 */
@@ -179,9 +187,9 @@ public abstract class AbsSetting extends OptNullBasicTypeFromStringGetter<String
 
 	/**
 	 * 获取波尔型型属性值
-	 * 
-	 * @param key 属性名
-	 * @param group 分组名
+	 *
+	 * @param key          属性名
+	 * @param group        分组名
 	 * @param defaultValue 默认值
 	 * @return 属性值
 	 */
@@ -190,10 +198,11 @@ public abstract class AbsSetting extends OptNullBasicTypeFromStringGetter<String
 	}
 
 	// --------------------------------------------------------------- Get long
+
 	/**
 	 * 获取long类型属性值
-	 * 
-	 * @param key 属性名
+	 *
+	 * @param key   属性名
 	 * @param group 分组名
 	 * @return 属性值
 	 */
@@ -203,9 +212,9 @@ public abstract class AbsSetting extends OptNullBasicTypeFromStringGetter<String
 
 	/**
 	 * 获取long类型属性值
-	 * 
-	 * @param key 属性名
-	 * @param group 分组名
+	 *
+	 * @param key          属性名
+	 * @param group        分组名
 	 * @param defaultValue 默认值
 	 * @return 属性值
 	 */
@@ -214,10 +223,11 @@ public abstract class AbsSetting extends OptNullBasicTypeFromStringGetter<String
 	}
 
 	// --------------------------------------------------------------- Get char
+
 	/**
 	 * 获取char类型属性值
-	 * 
-	 * @param key 属性名
+	 *
+	 * @param key   属性名
 	 * @param group 分组名
 	 * @return 属性值
 	 */
@@ -230,10 +240,11 @@ public abstract class AbsSetting extends OptNullBasicTypeFromStringGetter<String
 	}
 
 	// --------------------------------------------------------------- Get double
+
 	/**
 	 * 获取double类型属性值
-	 * 
-	 * @param key 属性名
+	 *
+	 * @param key   属性名
 	 * @param group 分组名
 	 * @return 属性值
 	 */
@@ -243,9 +254,9 @@ public abstract class AbsSetting extends OptNullBasicTypeFromStringGetter<String
 
 	/**
 	 * 获取double类型属性值
-	 * 
-	 * @param key 属性名
-	 * @param group 分组名
+	 *
+	 * @param key          属性名
+	 * @param group        分组名
 	 * @param defaultValue 默认值
 	 * @return 属性值
 	 */
@@ -256,13 +267,13 @@ public abstract class AbsSetting extends OptNullBasicTypeFromStringGetter<String
 	/**
 	 * 将setting中的键值关系映射到对象中,原理是调用对象对应的set方法<br>
 	 * 只支持基本类型的转换
-	 * 
+	 *
 	 * @param group 分组
-	 * @param bean Bean对象
+	 * @param bean  Bean对象
 	 * @return Bean
 	 */
 	public <T> T toBean(final String group, T bean) {
-		return BeanUtil.fillBean(bean, new ValueProvider<String>(){
+		return BeanUtil.fillBean(bean, new ValueProvider<String>() {
 
 			@Override
 			public Object value(String key, Type valueType) {
@@ -279,11 +290,38 @@ public abstract class AbsSetting extends OptNullBasicTypeFromStringGetter<String
 	/**
 	 * 将setting中的键值关系映射到对象中,原理是调用对象对应的set方法<br>
 	 * 只支持基本类型的转换
-	 * 
+	 *
+	 * @param group 分组
+	 * @param beanClass  Bean类型
+	 * @return Bean
+	 * @since 5.0.6
+	 */
+	public <T> T toBean(String group, Class<T> beanClass) {
+		return toBean(group, ReflectUtil.newInstance(beanClass));
+	}
+
+	/**
+	 * 将setting中的键值关系映射到对象中,原理是调用对象对应的set方法<br>
+	 * 只支持基本类型的转换
+	 *
+	 * @param <T> bean类型
 	 * @param bean Bean
 	 * @return Bean
 	 */
 	public <T> T toBean(T bean) {
 		return toBean(null, bean);
 	}
+
+	/**
+	 * 将setting中的键值关系映射到对象中,原理是调用对象对应的set方法<br>
+	 * 只支持基本类型的转换
+	 *
+	 * @param <T> bean类型
+	 * @param beanClass Bean类型
+	 * @return Bean
+	 * @since 5.0.6
+	 */
+	public <T> T toBean(Class<T> beanClass) {
+		return toBean(null, beanClass);
+	}
 }