2010-06-03 5 views
20

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 una Gerente de seguridad.Cómo seleccionar saxon TransformerFactory en Java

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

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

me encontré con este archivo en WEB-INF/lib/saxon9.jar pero cuando istantiate un TransformerFactory, la fábrica por defecto siempre se selecciona en lugar de una fábrica de Sajonia.

¿Cómo puedo seleccionar Saxon Transformer Factory?

Gracias

+0

Puede encontrar un resumen de todos los enfoques a continuación (y más) aquí: http://stackoverflow.com/questions/11314604/how-to-set-saxon-as-the-xslt-processor-in-java –

Respuesta

11

Se puede tratar mediante el establecimiento de la propiedad del sistema en su código como

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

hacer esto antes de obtener una instancia de TransformerFactory.

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

5

Si su aplicación requiere realmente sajón y no funciona con otro procesador entonces probablemente sería bien a instancia del TransformerFactory sajón directamente utilizando new net.sf.saxon.TransformerFactoryImpl()

22

La forma correcta de hacerlo es mediante la especificación de la clase de fábrica al conseguir 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 sajón

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

Javadocs:

obtener una nueva instancia de un TransformerFactory de clase de fábrica nombre . Esta función es útil cuando hay múltiples proveedores en el classpath . 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 un TransformerFactory, puede usar la fábrica para configurar y obtener instancias de transformador.

+1

Esto funciona a partir de Java v6 (http://docs.oracle.com/javase/6/docs/api/javax/xml/transform/TransformerFactory.html vs http://docs.oracle.com/javase/1.5.0 /docs/api/javax/xml/transform/TransformerFactory.html) –

+1

Esto no funciona con la versión 11.1.1.5.0 de Oracle Fusion Middleware, ya que utiliza implementaciones más antiguas dentro de sus archivos jar de cliente. – sweetfa

8

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

+0

Esto no funcionó para mí. Usé el directorio principal de META-INF de mi aplicación web. ¿Debo usar uno diferente? – Carsten

+0

Lo descubrí. Tiene que terminar en WEB-INF/classes/META-INF/... – Carsten

Cuestiones relacionadas