Spring Boot 2.6.1 不支持 SAX 功能

Him*_*rma 5 java spring sax logback spring-boot

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>
Run Code Online (Sandbox Code Playgroud)

但构建失败并出现以下异常:

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
Run Code Online (Sandbox Code Playgroud)

在 SaxEventRecorder.class 中,构建 SAX 解析器时失败

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
Run Code Online (Sandbox Code Playgroud)

有没有办法覆盖实施?

谢谢 :)

小智 12

升级时遇到同样的问题。这不是 Spring 问题,并且您不想自己重写实现。

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

我发现我的类路径上有一个“额外”实现,因为依赖项有自己的实现,SAXParserFactory而不是 Logback 期望的“典型”实现。而且这个“额外”SAXParserFactory不支持 Logback 试图启用的功能。

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

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

  • 要使用的实现也可以通过“-Djavax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl”作为java命令行参数来定义 (3认同)
  • 如果有人想知道,我通过添加 `xerces:xercesImpl:2.12.2` 来修复它。就我而言,导致错误的原因是我需要 `com.oracle.database.xml:xmlparserv2` 依赖项。xerces 被添加为 pom.xml 中的第一个依赖项。 (3认同)