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
是一个抽象类——它可以有多个实现。 newInstance
方法选择类路径上的最后一个/顶部实现。
我发现我的类路径上有一个“额外”的实现,因为依赖项有自己的
SAXParserFactory
实现,而不是 Logback 期望的“典型”实现。而这个“额外的”SAXParserFactory
不支持 Logback 试图启用的功能。
我必须在我的依赖项中显式声明一个 xerces 实现,以便“真实”实现优先于类路径上的其他“额外”实现。
所以我的建议是让你看看你有这个抽象类的实现(我可以使用 IntelliJ IDE 很容易地看到这个),然后管理/重新安排你的依赖关系,以便支持该功能的正确实现具有更高的优先级你的类路径。
对我来说,我们使用了一个旧的依赖项
<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 解决了我的问题!
可能不是您要找的东西,但对于我的项目,我们决定排除此解析器:
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8-production</artifactId>
<type>pom</type>
<exclusions>
<exclusion>
<groupId>com.oracle.database.xml</groupId>
<artifactId>xmlparserv2</artifactId>
</exclusion>
</exclusions>
</dependency>
但是如果你真的需要它,我建议你看看@matzeihnsein 的答案并升级你的版本。这样做对我也有帮助。