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); + } }