Как выбрать саксонский TransformerFactory в Java

В моем веб-приложении я должен использовать саксонский TransformerFactory для использования XSLT 2.0, но я не могу использовать setProperty метод, потому что я не имею этого права на веб-сервере и существует Менеджер безопасности.

Таким образом, я считал, что должно быть возможно сделать это:

Используйте Сервисы API (как детализировано в спецификации JAR), при наличии, для определения имени класса. Сервисы API будут искать имя класса в файле META-INF/services/javax.xml.transform. TransformerFactory в банках, доступных времени выполнения.

Я нашел этот файл в WEB-INF/lib/saxon9.jar, но когда я istantiate TransformerFactory, фабрика по умолчанию всегда выбирается вместо саксонской фабрики.

Как я могу выбрать саксонскую Фабрику Преобразователя?

Спасибо

20
задан pAkY88 30 April 2015 в 12:41
поделиться

3 ответа

Не могли бы вы попробовать, установив системное свойство в вашем коде, например

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

, сделайте это до получения экземпляра TransformerFactory.

Примечание: это заставит все веб-приложения на вашем Tomcat использовать saxon - поэтому вы должны убедиться, что любые другие веб-приложения, которые использовали значение по умолчанию, в порядке.

11
ответ дан 29 November 2019 в 23:19
поделиться

Если вашему приложению действительно требуется saxon и оно не будет работать с другим процессором, то, вероятно, будет неплохо инстанцировать saxon TransformerFactory напрямую, используя new net.sf.saxon.TransformerFactoryImpl()

5
ответ дан 29 November 2019 в 23:19
поделиться

Правильный способ сделать это - указать фабричный класс при получении нового TransformerFactory.

Я не думаю, что вызов конкретной фабричной реализации сработает - я считаю, что системный преобразователь по умолчанию все еще может быть возвращен (по крайней мере, это то, что произошло, когда у меня были xalan и saxon в пути к классам).

пример:

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

или для saxon

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

Javadocs:

Получить новый экземпляр TransformerFactory из фабричного класса название. Эта функция полезна, когда есть несколько провайдеров в путь к классам. Это дает больше контроля приложение, как оно может указывать какой провайдер должен быть загружен. Один раз приложение получило ссылка на TransformerFactory it можно использовать фабрику для настройки и получить экземпляры трансформатора.

25
ответ дан 29 November 2019 в 23:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: