Подтвердить что ты не робот

Как выбрать саксон 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?

Спасибо

4b9b3361

Ответ 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()