Spring Boot 2.6.1 出现SAX Feature Not Supported报错如何解决?
问题根因
当前报错是因为项目运行时加载的SAX解析器实现为Oracle的oracle.xml.jaxp.JXSAXParserFactory,该实现不支持logback 1.2.7中SaxEventRecorder要设置的两个XXE防护特性,触发配置异常。
解决方案
按落地成本从低到高排序:
方案1:指定兼容的SAX解析器实现(优先推荐)
无需修改任何代码,仅需在应用启动参数中添加JAXP系统属性,指定使用JDK内置的Xerces解析器即可,该实现完全支持logback需要的特性:
-Djavax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl
如果是容器部署,可以把该参数加入容器的JVM启动参数配置中。
方案2:覆盖重写SaxEventRecorder实现(适用于必须保留Oracle XML解析器的场景)
利用类加载的优先顺序,在项目中创建和logback完全同包同名的类,修改buildSaxParser方法的逻辑,忽略不支持的特性即可:
- 在项目的java源码目录下创建包路径
ch.qos.logback.core.joran.event - 新建同名类
SaxEventRecorder,将原有类的全量代码复制到该类中,修改buildSaxParser方法如下:
private SAXParser buildSaxParser() throws JoranException { try { SAXParserFactory spf = SAXParserFactory.newInstance(); spf.setValidating(false); // 针对不支持的特性做异常捕获,不支持则直接跳过 try { spf.setFeature("http://xml.org/sax/features/external-general-entities", false); spf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); } catch (ParserConfigurationException ignored) { // Oracle解析器不支持该特性,忽略即可 } spf.setNamespaceAware(true); return spf.newSAXParser(); } catch (Exception pce) { String errMsg = "Parser configuration error occurred"; addError(errMsg, pce); throw new JoranException(errMsg, pce); } }
注意:该方案调整了logback原有的XXE防护逻辑,仅适用于logback配置文件完全由内部管控、不会引入外部恶意XML的场景。
方案3:排除Oracle XML解析器依赖
如果Oracle XML解析器是项目依赖传递引入的非必要组件,可以在pom.xml中找到引入该依赖的节点,添加exclusion配置排除即可,JDK内置的Xerces解析器完全可以满足常规XML解析需求:
<exclusion> <groupId>com.oracle</groupId> <artifactId>xmlparserv2</artifactId> </exclusion>
内容的提问来源于stack exchange,提问作者Himanshu Sharma
相关产品推荐
相关产品推荐

