es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Funcionalidad SAX no soportada en Spring Boot 2.6.1

Spring boot 2.6.1 admite logback 1.2.7

He agregado las siguientes dependencias en el proyecto:
xml
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>

Pero la compilación falla con la siguiente excepción:

Caused by: javax.xml.parsers.ParserConfigurationException: No se admite la función SAX 'http://xml.org/sax/features/external-general-entities'.
at oracle.xml.jaxp.JXSAXParserFactory.setFeature(JXSAXParserFactory.java:272)
at ch.qos.logback.core.joran.event.SaxEventRecorder.buildSaxParser(SaxEventRecorder.java:82)
... 44 más

En la clase SaxEventRecorder, falla al crear el analizador SAX

java
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 = "Se produjo un error en la configuración del analizador";
addError(errMsg, pce);
throw new JoranException(errMsg, pce);
}
}

¿Hay alguna forma de anular la implementación?

Gracias 🙂

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible anular la implementación. El problema parece estar en SAXParserFactory utilizado por Logback. Puede anularlo con una implementación personalizada que admita las características requeridas por Logback.

    Para hacerlo, cree una clase que extienda SAXParserFactory y anule el método setFeature para admitir las características requeridas:

    public class CustomSAXParserFactory extends SAXParserFactory {
    
       @Override
       public void setFeature(String name, boolean value) throws ParserConfigurationException {
           if ("http://xml.org/sax/features/external-general-entities".equals(nombre)) {
               // Habilitar el soporte para entidades generales externas
               super.setFeature(nombre, true);
           } else {
               super.setFeature(nombre, valor);
           }
       }
    
       // Anular otros métodos si es necesario
    
    }
    

    Luego, establezca la propiedad del sistema “javax.xml.parsers.SAXParserFactory” con el nombre completo de su clase de fábrica personalizada, ya sea como argumento de línea de comandos o en el código de la aplicación:

    System.setProperty("javax.xml.parsers.SAXParserFactory", "com.example.CustomSAXParserFactory");
    

    Esto asegurará que Logback utilice su implementación personalizada de SAXParserFactory que admite las características requeridas.

Comments are closed.