Как выбрать saxon TransformerFactory в Java

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

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

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

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

Как я могу выбрать Saxon Transformer Factory?

Спасибо


person pAkY88    schedule 03.06.2010    source источник
comment
Сводку всех приведенных ниже (и других) подходов можно найти здесь: stackoverflow.com/questions/11314604/   -  person Wayne    schedule 08.07.2012


Ответы (4)


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

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

пример:

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

или для саксона

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

Документы Javadocs:

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

person Andrew B    schedule 02.08.2010
comment
comment
Это не работает с выпуском Oracle Fusion Middleware 11.1.1.5.0, поскольку он использует более старые реализации в своих клиентских jar-файлах. - person sweetfa; 24.04.2012

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

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

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

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

person JoseK    schedule 04.06.2010

Создайте файл META-INF/services/javax.xml.transform.TransformerFactory с содержимым: net.sf.saxon.TransformerFactoryImpl. Вот и все.

person yegor256    schedule 26.05.2011
comment
У меня это не сработало. Я использовал основной каталог META-INF своего веб-приложения. Мне нужно использовать другой? - person Carsten; 12.05.2015

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

person Jörn Horstmann    schedule 04.06.2010