web-dev-qa-db-fra.com

Comment désactiver les avertissements accessExternalDTD et entityExpansionLimit avec déconnexion

J'utilise logback avec groovy et je reçois de nombreux avertissements lors de l'analyse du XML. Je suis conscient du bogue dans JDK1.7_u45 qui est à l'origine de cela.

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.

Existe-t-il un moyen de désactiver l'affichage de ces avertissements dans DEBUG? J'ai essayé d'écrire un filtre à l'aide de Filter, mais je n'ai pas aidé.

28
msoori

Il s'agit d'un bogue connu dans le JRE qui le signale comme un avertissement. Voir les rapports de bogues ici et ici

Le problème se produit uniquement lorsque vous avez un pot xerces dans votre chemin de classe, l'implémentation xerces ne reconnaît pas la propriété et lève une exception sur org.Apache.xerces.jaxp.SAXParserImpl $ JAXPSAXParser.setProperty () , ce qui entraîne dans un journal d'avertissement (à System.err) à partir du com.Sun.org.Apache.xalan.internal.xsltc.compiler.Parser.parse ()

La solution simple (si possible) consiste à supprimer le pot xerces de votre chemin de classe.

Votre filtre de journal ne fonctionne pas car l'erreur n'est jamais envoyée à slf4j. Quel type de suggestion d'un moyen compliqué de résoudre le problème - rediriger System.err vers slf4j puis utiliser un filtre de journalisation dessus.

Exemple de code pour reproduire le problème (basé sur le rapport de problème):

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

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

Et la dépendance maven:

<dependency>
    <groupId>xerces</groupId>
    <artifactId>xercesImpl</artifactId>
    <version>2.11.0</version>
</dependency>
19
6ton

J'ai également eu cette erreur dans un projet. Si je comprends bien, l'implémentation de Xerces est intégrée dans les nouvelles versions de JRE. Plus important encore, la version JRE prend correctement en charge les propriétés accessExternalDTD et entityExpansionLimit.

Parce que j'avais une dépendance en aval qui incluait xercesImpl.jar dans mon fichier de guerre, ma solution était de simplement le tirer en utilisant le code ci-dessous dans mon build.gradle et laisser l'implémentation JRE de xerces prendre le relais dans le chemin de classe.

warApplication {
    from '/WEB-INF/lib'
        exclude 'xercesImpl*.jar'
}
2
Dana Britzman

S'il n'est pas possible de supprimer des xerces du chemin de classe, vous pouvez être plus explicite sur la fabrique que vous souhaitez utiliser, évitant ainsi de tirer des xerces. Voici deux façons de résoudre des usines spécifiques:

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();
  }
}
0
David Burström