Как выбрать саксонский TransformerFactory в Java - PullRequest
20 голосов
/ 03 июня 2010

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

Итак, я прочитал, что это можно сделать:

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

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

Как выбрать Саксонский трансформаторный завод?

Спасибо

Ответы [ 4 ]

25 голосов
/ 02 августа 2010

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

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

пример:

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

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

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

Javadocs:

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

11 голосов
/ 04 июня 2010

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

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

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

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

8 голосов
/ 26 мая 2011

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

5 голосов
/ 04 июня 2010

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

...