java tomcat servlets sax xslt-2.0

Cómo seleccionar saxon TransformerFactory en Java



tomcat servlets (4)

¿Puedes intentar estableciendo la propiedad del sistema en tu código como

System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");

haz esto antes de obtener una instancia de TransformerFactory.

Nota: esto obligará a todas las aplicaciones web en tu Tomcat a usar saxon, por lo que debe asegurarse de que cualquier otra aplicación que esté usando el predeterminado sea correcta.

En mi aplicación web necesito usar Saxon TransformerFactory para usar XSLT 2.0 pero no puedo usar el método setProperty porque no tengo este derecho en el servidor web y hay un administrador de seguridad.

Entonces, he leído que debería ser posible hacer esto:

Use la API de servicios (como se detalla en la especificación JAR), si está disponible, para determinar el nombre de clase. La API de Servicios buscará un nombre de clase en el archivo META-INF / services / javax.xml.transform.TransformerFactory en jar disponibles para el tiempo de ejecución.

Encontré este archivo en WEB-INF / lib / saxon9.jar, pero cuando configuro una TransformerFactory, siempre se selecciona la fábrica predeterminada en lugar de una fábrica de Saxon.

¿Cómo puedo seleccionar Saxon Transformer Factory?

Gracias


Cree el archivo META-INF/services/javax.xml.transform.TransformerFactory con contenido: net.sf.saxon.TransformerFactoryImpl . Eso es.


La forma correcta de hacerlo es especificando la clase de fábrica al obtener una nueva TransformerFactory.

No creo que llamar a una implementación de fábrica específica funcionará, creo que el transformador del sistema predeterminado aún podría ser devuelto (al menos eso es lo que sucedió cuando tuve xalan y saxon en la ruta de clases).

ejemplo:

TransformerFactory tFactory = TransformerFactory.newInstance("org.apache.xalan.processor.TransformerFactoryImpl",null);

o para saxon

TransformerFactory tFactory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl",null);

Javadocs:

Obtenga una nueva instancia de una TransformerFactory del nombre de la clase de fábrica. Esta función es útil cuando hay múltiples proveedores en el classpath. Le da más control a la aplicación, ya que puede especificar qué proveedor debe cargarse. Una vez que una aplicación ha obtenido una referencia a una TransformerFactory, puede usar la fábrica para configurar y obtener instancias de transformador.


Si su aplicación realmente requiere saxon y no funciona con otro procesador, entonces probablemente estaría bien crear una instancia de saxon TransformerFactory directamente usando new net.sf.saxon.TransformerFactoryImpl()