В моем веб-приложении я должен использовать саксонский TransformerFactory для использования XSLT 2.0, но я не могу использовать setProperty метод, потому что я не имею этого права на веб-сервере и существует Менеджер безопасности.
Таким образом, я считал, что должно быть возможно сделать это:
Используйте Сервисы API (как детализировано в спецификации JAR), при наличии, для определения имени класса. Сервисы API будут искать имя класса в файле META-INF/services/javax.xml.transform. TransformerFactory в банках, доступных времени выполнения.
Я нашел этот файл в WEB-INF/lib/saxon9.jar, но когда я istantiate TransformerFactory, фабрика по умолчанию всегда выбирается вместо саксонской фабрики.
Как я могу выбрать саксонскую Фабрику Преобразователя?
Спасибо
Не могли бы вы попробовать, установив системное свойство в вашем коде, например
System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");
, сделайте это до получения экземпляра TransformerFactory.
Примечание: это заставит все веб-приложения на вашем Tomcat использовать saxon - поэтому вы должны убедиться, что любые другие веб-приложения, которые использовали значение по умолчанию, в порядке.
Если вашему приложению действительно требуется saxon и оно не будет работать с другим процессором, то, вероятно, будет неплохо инстанцировать saxon TransformerFactory напрямую, используя new net.sf.saxon.TransformerFactoryImpl()
Правильный способ сделать это - указать фабричный класс при получении нового 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 можно использовать фабрику для настройки и получить экземпляры трансформатора.