私の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を選択するにはどうすればよいですか?
ありがとう
これを行う適切な方法は、新しい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への参照を取得すると、ファクトリを使用してトランスフォーマーインスタンスを構成および取得できます。
次のようにコードでシステムプロパティを設定して試すことができますか
System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");
transformerFactoryのインスタンスを取得する前にこれを行ってください。
注:これにより、Tomcat上のすべてのWebアプリがsaxonを使用するように強制されます。したがって、デフォルトを使用していた他のWebアプリに問題がないことを確認する必要があります。
ファイルを作成するMETA-INF/services/javax.xml.transform.TransformerFactory
コンテンツ付き:net.sf.saxon.TransformerFactoryImpl
。それでおしまい。
アプリケーションが本当にsaxonを必要とし、別のプロセッサで動作しない場合は、new net.sf.saxon.TransformerFactoryImpl()
を使用してsaxonTransformerFactoryを直接インスタンス化するのがおそらく問題ありません。