web-dev-qa-db-ja.com

Java)でsaxonTransformerFactoryを選択する方法

私のWebアプリケーションでは、XSLT2.0を使用するためにSaxonTransformerFactoryを使用する必要がありますが、Webサーバーにこの権限がなく、セキュリティマネージャーがあるため、setPropertyメソッドを使用できません。

だから私はこれを行うことが可能であるはずだと読んだ:

可能な場合は、Services API(JAR仕様で詳しく説明されています)を使用して、クラス名を判別します。 Services APIは、ランタイムで使用可能なjar内のファイルMETA-INF/services /javax.xml.transform.TransformerFactoryでクラス名を検索します。

このファイルはWEB-INF/lib/saxon9.jarにありますが、TransformerFactoryをインスタンス化すると、Saxonファクトリではなくデフォルトのファクトリが常に選択されます。

Saxon Transformer Factoryを選択するにはどうすればよいですか?

ありがとう

20
pAkY88

これを行う適切な方法は、新しいTransformerFactoryを取得するときにファクトリクラスを指定することです。

特定のファクトリ実装を呼び出すことが機能するとは思いません-デフォルトのシステムトランスフォーマーがまだ返される可能性があると思います(少なくとも、クラスパスにxalanとsaxonがあったときに起こったことです)。

例:

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

またはサクソン人のために

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

Javadoc:

ファクトリクラス名からTransformerFactoryの新しいインスタンスを取得します。この関数は、クラスパスに複数のプロバイダーがある場合に役立ちます。ロードするプロバイダーを指定できるため、アプリケーションをより細かく制御できます。アプリケーションがTransformerFactoryへの参照を取得すると、ファクトリを使用してトランスフォーマーインスタンスを構成および取得できます。

25
Andrew B

次のようにコードでシステムプロパティを設定して試すことができますか

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

transformerFactoryのインスタンスを取得する前にこれを行ってください。

注:これにより、Tomcat上のすべてのWebアプリがsaxonを使用するように強制されます。したがって、デフォルトを使用していた他のWebアプリに問題がないことを確認する必要があります。

11
JoseK

ファイルを作成するMETA-INF/services/javax.xml.transform.TransformerFactoryコンテンツ付き:net.sf.saxon.TransformerFactoryImpl。それでおしまい。

8
yegor256

アプリケーションが本当にsaxonを必要とし、別のプロセッサで動作しない場合は、new net.sf.saxon.TransformerFactoryImpl()を使用してsaxonTransformerFactoryを直接インスタンス化するのがおそらく問題ありません。

5
Jörn Horstmann