java Sping Boot 2.6.1中不支持SAX功能

gr8qqesn  于 2023-05-15  发布在  Java
关注(0)|答案(3)|浏览(194)

Sping Boot 2.6.1支持logback 1.2.7
我在project中添加了以下依赖项

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

是否有方法覆盖实现?
Thanks:)

svdrlsy4

svdrlsy41#

在升级时遇到了同样的问题。这不是Spring的问题,您也不想自己重写实现。
SAXParserFactory是一个抽象类-它可以有多个实现。newInstance方法选择类路径上的最后一个/最上面的实现。
我发现我的类路径上有一个“额外”的实现,这是因为依赖项有自己的SAXParserFactory实现,而不是Logback期望的“典型”实现。这个“额外的”SAXParserFactory不支持Logback试图启用的功能。
我必须在我的依赖项中显式地声明一个xerces实现,以便“真实的的”实现优先于类路径上的其他“额外的”实现。
所以我的建议是,你看看你有这个抽象类的实现(我可以很容易地看到这使用IntelliJ IDE),然后管理/重新安排你的依赖关系,以便支持该功能的适当实现在你的类路径上具有更高的优先级。

vfh0ocws

vfh0ocws2#

对我来说,我们使用了一种古老的依赖

<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>

ojdbc 8解决了我的问题!

pu82cl6c

pu82cl6c3#

也许这并不是你想要的,但是对于我的项目,我们决定排除这个解析器:

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

相关问题