Spring Boot 2.6.1 不支持 SAX 功能
SAX Feature Not Supported in Spring Boot 2.6.1
Spring boot 2.6.1 支持logback 1.2.7
我在项目中添加了以下依赖
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
但是构建失败,出现以下异常:
Caused by: javax.xml.parsers.ParserConfigurationException: SAX feature 'http://xml.org/sax/features/external-general-entities' not supported.
at oracle.xml.jaxp.JXSAXParserFactory.setFeature(JXSAXParserFactory.java:272)
at ch.qos.logback.core.joran.event.SaxEventRecorder.buildSaxParser(SaxEventRecorder.java:82)
... 44 more
在 SaxEventRecorder.class 中,构建 SAX 解析器时失败
private SAXParser buildSaxParser() throws JoranException {
try {
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setValidating(false);
//spf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
spf.setFeature("http://xml.org/sax/features/external-general-entities", false);
spf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
spf.setNamespaceAware(true);
return spf.newSAXParser();
} catch (Exception pce) {
String errMsg = "Parser configuration error occurred";
addError(errMsg, pce);
throw new JoranException(errMsg, pce);
}
}
有没有办法覆盖实现?
谢谢:)
在升级过程中遇到同样的问题。这不是 Spring 问题,您不想自己覆盖实现。
SAXParserFactory
是一个抽象 class - 它可以有多个实现。 newInstance
方法在 class 路径上选择 last/top 实现。
我发现我的 class 路径上有一个“额外的”实现,因为依赖项有自己的 SAXParserFactory
实现,而不是 Logback 期望的 'typical' 实现.而这个“额外的”SAXParserFactory
不支持 Logback 试图启用的功能。
我必须在我的依赖项中显式声明一个更高级别的 xerces 实现,以便“真实”实现优先于 class 路径上的其他“额外”实现。
所以我的建议是让你看看这个抽象 class 你有什么实现(我可以使用 IntelliJ IDE 很容易地看到这个),然后 manage/re-arrange 你的依赖项所以支持该功能的正确实现在您的 class 路径上具有更高的优先级。
对我来说,我们使用了一个旧的依赖项
<groupId>com.oracle.jdbc</groupId>
<artifactId>ojdbc7</artifactId>
<version>12.1.0.2</version>
更新到
<groupId>com.oracle.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>12.2.0.1</version>
ojdbc8 解决了我的问题!
Spring boot 2.6.1 支持logback 1.2.7
我在项目中添加了以下依赖
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
但是构建失败,出现以下异常:
Caused by: javax.xml.parsers.ParserConfigurationException: SAX feature 'http://xml.org/sax/features/external-general-entities' not supported.
at oracle.xml.jaxp.JXSAXParserFactory.setFeature(JXSAXParserFactory.java:272)
at ch.qos.logback.core.joran.event.SaxEventRecorder.buildSaxParser(SaxEventRecorder.java:82)
... 44 more
在 SaxEventRecorder.class 中,构建 SAX 解析器时失败
private SAXParser buildSaxParser() throws JoranException {
try {
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setValidating(false);
//spf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
spf.setFeature("http://xml.org/sax/features/external-general-entities", false);
spf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
spf.setNamespaceAware(true);
return spf.newSAXParser();
} catch (Exception pce) {
String errMsg = "Parser configuration error occurred";
addError(errMsg, pce);
throw new JoranException(errMsg, pce);
}
}
有没有办法覆盖实现?
谢谢:)
在升级过程中遇到同样的问题。这不是 Spring 问题,您不想自己覆盖实现。
SAXParserFactory
是一个抽象 class - 它可以有多个实现。 newInstance
方法在 class 路径上选择 last/top 实现。
我发现我的 class 路径上有一个“额外的”实现,因为依赖项有自己的 SAXParserFactory
实现,而不是 Logback 期望的 'typical' 实现.而这个“额外的”SAXParserFactory
不支持 Logback 试图启用的功能。
我必须在我的依赖项中显式声明一个更高级别的 xerces 实现,以便“真实”实现优先于 class 路径上的其他“额外”实现。
所以我的建议是让你看看这个抽象 class 你有什么实现(我可以使用 IntelliJ IDE 很容易地看到这个),然后 manage/re-arrange 你的依赖项所以支持该功能的正确实现在您的 class 路径上具有更高的优先级。
对我来说,我们使用了一个旧的依赖项
<groupId>com.oracle.jdbc</groupId>
<artifactId>ojdbc7</artifactId>
<version>12.1.0.2</version>
更新到
<groupId>com.oracle.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>12.2.0.1</version>
ojdbc8 解决了我的问题!