2010-06-03 15 views
20

Nella mia applicazione web ho bisogno di usare Saxon TransformerFactory per usare XSLT 2.0 ma non posso usare il metodo setProperty perché non ho questo diritto sul server web e c'è un Manager della sicurezza.Come selezionare saxon TransformerFactory in Java

Così ho letto che dovrebbe essere possibile fare questo:

utilizzare l'API di servizi (come dettagliato nella specifica JAR), se disponibile, per determinare il nome di classe. L'API dei servizi cercherà un nome di classe nel file META-INF/services/javax.xml.transform.TransformerFactory nei vasi disponibili per il runtime.

Ho trovato questo file in WEB-INF/lib/saxon9.jar ma quando eseguo un'istanza di TransformerFactory, la fabbrica predefinita è sempre selezionata al posto di una fabbrica Saxon.

Come selezionare Saxon Transformer Factory?

Grazie

+0

Una sintesi di tutti gli approcci di seguito (e più) può essere trovato qui: http://stackoverflow.com/questions/11314604/how-to-set-saxon-as-the-xslt-processor-in-java –

risposta

11

Puoi provare impostando la proprietà di sistema nel codice come

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

fare questo prima di ottenere un esempio di TransformerFactory.

Nota: questo costringerà tutte le webapps sul Tomcat di utilizzare saxon - quindi bisogna assicurarsi che tutti gli altri webapps che stavano usando il default vanno bene.

5

Se l'applicazione richiede davvero sassone e non funzionerà con un altro processore allora sarebbe probabilmente bene per istanziare il TransformerFactory saxon utilizzando direttamente new net.sf.saxon.TransformerFactoryImpl()

22

Il modo corretto per farlo è specificando la classe factory quando ottiene una nuova TransformerFactory.

Non penso che chiamare una specifica implementazione di fabbrica possa funzionare: credo che il trasformatore di sistema predefinito possa ancora essere restituito (almeno quello che è successo quando ho avuto xalan e sassone nel classpath).

esempio:

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

o per saxon

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

Javadocs:

ottenere una nuova istanza di un TransformerFactory dalla classe fabbrica nome. Questa funzione è utile quando ci sono più provider nel classpath . Dà più controllo all'applicazione in quanto può specificare quale provider deve essere caricato. Una volta che un'applicazione ha ottenuto un riferimento a TransformerFactory, lo può utilizzare la fabbrica per configurare e ottenere le istanze del trasformatore.

+1

Funziona da 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

Questo non funziona con la release Oracle Fusion Middleware 11.1.1.5.0 in quanto utilizza implementazioni precedenti all'interno dei suoi file jar client. – sweetfa

8

Crea file META-INF/services/javax.xml.transform.TransformerFactory con contenuto: net.sf.saxon.TransformerFactoryImpl. Questo è tutto.

+0

Questo non ha funzionato per me. Ho usato la directory principale META-INF della mia webapp. Devo usare un altro? – Carsten

+0

L'ho capito. Deve finire in WEB-INF/classes/META-INF/... – Carsten

Problemi correlati