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 解决了我的问题!