Spring Boot 2.6.1 不支持 SAX 功能

问题描述 投票:0回答:3

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

有没有办法覆盖实现?

谢谢:)

java spring spring-boot logback sax
3个回答
11
投票

在升级过程中遇到同样的问题。这不是 Spring 问题,您不想自己重写实现。

SAXParserFactory
是一个抽象类——它可以有多个实现。
newInstance
方法选择类路径上的最后一个/顶部实现。

我发现我的类路径上有一个“额外”的实现,因为依赖项有自己的

SAXParserFactory
实现,而不是 Logback 期望的“典型”实现。而这个“额外的”
SAXParserFactory
不支持 Logback 试图启用的功能。

我必须在我的依赖项中显式声明一个 xerces 实现,以便“真实”实现优先于类路径上的其他“额外”实现。

所以我的建议是让你看看你有这个抽象类的实现(我可以使用 IntelliJ IDE 很容易地看到这个),然后管理/重新安排你的依赖关系,以便支持该功能的正确实现具有更高的优先级你的类路径。


0
投票

对我来说,我们使用了一个旧的依赖项

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


0
投票

可能不是您要找的东西,但对于我的项目,我们决定排除此解析器:

    <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 的答案并升级你的版本。这样做对我也有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.