Как выбрать саксон TransformerFactory в Java
В моем веб-приложении мне нужно использовать Saxon TransformerFactory для использования XSLT 2.0, но я не могу использовать метод setProperty, потому что у меня нет этого права на веб-сервере, и есть диспетчер безопасности.
Итак, я прочитал, что это должно быть возможно:
Используйте API-интерфейс служб (как указано в спецификации JAR), если он доступен, для определения имени класса. API-интерфейс служб будет искать имя класса в файле META-INF/services/javax.xml.transform.TransformerFactory в банках, доступных для среды выполнения.
Я нашел этот файл в WEB-INF/lib/saxon9.jar, но когда я инициализирую TransformerFactory, по умолчанию factory всегда выбирается вместо Saxon factory.
Как выбрать Saxon Transformer Factory?
Спасибо
Ответы
Ответ 1
Правильный способ сделать это - указать класс factory при получении нового TransformerFactory.
Я не думаю, что вызов конкретной реализации factory будет работать. Я считаю, что системный трансформатор по умолчанию все равно может быть возвращен (по крайней мере, то, что произошло, когда у меня был xalan и saxon в пути к классам).
Пример:
TransformerFactory tFactory = TransformerFactory.newInstance("org.apache.xalan.processor.TransformerFactoryImpl",null);
или для саксона
TransformerFactory tFactory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl",null);
Javadocs:
Получить новый экземпляр TransformerFactory из класса factoryимя. Эта функция полезна, когда в CLASSPATH. Это дает больший контроль над приложение, поскольку оно может указывать который должен быть загружен. однажды приложение получило ссылка на TransformerFactory it может использовать factory для настройки и получить экземпляры трансформатора.
Ответ 2
Можете ли вы попробовать установить системное свойство в своем коде, например
System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");
сделайте это, прежде чем получить экземпляр TransformerFactory.
Примечание: это заставит все веб-приложения на вашем Tomcat использовать саксон - так что вы должны убедиться, что любые другие веб-приложения, которые использовали значение по умолчанию, в порядке.
Ответ 3
Создайте файл META-INF/services/javax.xml.transform.TransformerFactory
с контентом: net.sf.saxon.TransformerFactoryImpl
. Что это.
Ответ 4
Если вашему приложению действительно требуется саксон и он не будет работать с другим процессором, то, вероятно, было бы неплохо создать экземпляр саксона TransformerFactory с помощью new net.sf.saxon.TransformerFactoryImpl()