当前位置: 首页 > 知识库问答 >
问题:

如何使用logback禁用accessExternalDTD和entityExpansionLimit警告

申屠无尘
2023-03-14

我正在使用groovy的logback,解析xml时会出现很多警告。我知道JDK1中的错误。7_u45导致了这一点。

Warning:  org.apache.xerces.parsers.SAXParser: Property 'http://javax.xml.XMLConstants/property/accessExternalDTD' is not recognized.
Warning:  org.apache.xerces.parsers.SAXParser: Property 'http://www.oracle.com/xml/jaxp/properties/entityExpansionLimit' is not recognized.

有没有什么方法可以关闭这个日志警告显示在DEBUG中?我尝试使用过滤器编写过滤器,但没有帮助。

共有3个答案

连志义
2023-03-14

如果无法从类路径中删除Xerce,可以更明确地说明要使用哪个工厂,从而避免拉入Xerce。以下是解决特定工厂问题的两种方法:

public static SchemaFactory getSchemaFactory() {
  return schemaFactory =
    SchemaFactory.newInstance(
        "http://www.w3.org/2001/XMLSchema",
        "com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory",
        null);
}

public static TransformerFactory getTransformerFactory() {
  try {
    final Class<?> transformerFactoryImplClass =
      TransformerFactory.class
          .getClassLoader().loadClass("com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl");
    final Method factoryGetter =
      transformerFactoryImplClass.getDeclaredMethod("newTransformerFactoryNoServiceLoader");
    return (TransformerFactory) factoryGetter.invoke(null);
  } catch (ClassNotFoundException
    | NoSuchMethodException
    | IllegalAccessException
    | InvocationTargetException e) {
    // fallback in case com.sun.* is not available
    return TransformerFactory.newInstance();
  }
}
谢海阳
2023-03-14

我在一个项目中也犯了这个错误。据我所知,较新版本的JRE内置了Xerces实现。更重要的是,JRE版本正确地支持accessExternalDTDentityExpansionLimit属性。

因为我有一个下游依赖项,它包括我的war文件中的xercesImpl.jar,所以我的解决方案是使用build.gradle中的代码将其拉出,并让xerces的JRE实现在类路径中接管。

warApplication {
    from '/WEB-INF/lib'
        exclude 'xercesImpl*.jar'
}
吕飞翼
2023-03-14

这是JRE中的一个已知错误,它将此报告为警告。查看此处和此处的错误报告

只有当类路径中有xerces jar时,问题才会发生,xerces实现无法识别该属性,并在org上引发异常。阿帕奇。薛西斯。jaxp。saxpasserimpl$JAXPSAXParser。setProperty(),它会从com生成警告日志(到System.err)。太阳组织。阿帕奇。泽兰。内部的xsltc。编译器。解析器。解析()

简单(如果可能的话)的解决方案是从类路径中删除xerces jar。

日志过滤器不工作,因为错误从未发送到slf4j。这意味着一种复杂的解决问题的方法——重定向系统。err到slf4j,然后在其上使用日志过滤器。

重现问题的示例代码(基于问题报告):

import java.io.IOException;
import java.net.URL;

import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamSource;

public class XercesTest {
    public static void main(String[] args) throws IOException, TransformerConfigurationException {
        TransformerFactory tf = TransformerFactory.newInstance();
        URL xsl = MainClass.class.getResource("build.xsl");
        StreamSource stylesheetSource = new StreamSource(
            xsl.openStream(), xsl.toExternalForm());
        tf.newTransformer(stylesheetSource);
    }
}

建筑xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <!-- TODO: Auto-generated template -->
    </xsl:template>
</xsl:stylesheet>

和maven依赖:

<dependency>
    <groupId>xerces</groupId>
    <artifactId>xercesImpl</artifactId>
    <version>2.11.0</version>
</dependency>
 类似资料:
  • 问题内容: 我将groovy与logback结合使用,并且在解析xml时会收到很多警告。我知道导致此的JDK1.7_u45中的错误。 有什么办法可以关闭此日志警告,使其不再显示在DEBUG中?我尝试使用过滤器编写过滤器,但没有帮助。 问题答案: 这是JRE中的一个已知错误,将其报告为警告。在此处 和此处 查看错误报告 仅当您在类路径中有xerces jar时,该问题才会发生,xerces实现无法识

  • 问题内容: 我正在使用的代码会使用该warnings库引发很多(目前对我而言)无用的警告。阅读(/扫描)文档后,我只找到了一种禁用单个功能警告的方法。但是我不想更改太多代码。 可能有像这样的标志吗? 你会推荐什么? 问题答案: 有-W选项。 python -W ignore foo.py

  • 问题内容: 我正在尝试在Pylint 0.21.1中禁用警告C0321(“在一行上有多个语句” –我经常将带有短单行结果的语句放在同一行上)(如果重要:astng 0.20)。 1,常见的0.50.3,Python 2.6.6(r266:84292,2010年9月15日,16:22:56))。 我尝试添加Pylint配置文件,但是Pylint坚持要报告它。该行的变体(如或)被标记为错误,因此Pyl

  • 请查找我的应用程序登录FileAppender配置。 我没有为警报文件追加器配置任何rollingpolicy,但仍在进行滚动。我需要一个单一的文件,我的所有错误通过一天,一年等,请帮助。 谢谢Satyajit

  • 我试图禁用MAMP中已弃用的警告。我的MAMP php版本是5.5.18。php.ini文件 /Applications/MAMP/bin/php/php5.5.18/conf/如我在phpinfo()中看到的。我的问题是无论我在php.ini.做什么都不会改变 我试过了 甚至: 另一方面 但是警告仍然显示在我的页面上。 我错过了什么? 谢啦

  • 我正在使用Spring Boot构建一个命令行应用程序。在这样的应用程序中,日志反馈控制台日志记录是不合适的。我怎样才能完全禁用控制台附加器,但仍然让文件附加器在默认的Spring Boot支持下工作呢? 我在这里创建了一个特性请求,以便更简单地支持该特性: https://github.com/spring-projects/spring-boot/issues/1612