Я запускаю webapp в Tomcat 8, который использует OpenSAML. Я одобрил Xerces в Tomcat, я проверил, что одобренный путь dir установлен правильно, кажется, что все работает нормально:
[ajp-apr-8009-exec-22] DEBUG org.opensaml.xml.Configuration - VM с использованием парсера JAXP org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
Я получаю несколько запросов, которые работают очень хорошо, все кажется замечательным, я могу пробежать этот раздел кода без ошибок, а затем внезапно начинаю получать эту ошибку:
OpenSAML требует XML-анализатор, который поддерживает JAXP 1.3 и DOM3. В настоящее время JVM настроен на использование анализатора Sun XML, который, как известно, является ошибкой и не может использоваться с OpenSAML. Пожалуйста, поддержите функциональную библиотеку JAXP (ы), такую как Xerces и Xalan. Инструкции о том, как одобрить новый парсер, см. Http://java.sun.com/j2se/1.5.0/docs/guide/standards/index.html.
at org.opensaml.xml.Configuration.validateNonSunJAXP(Configuration.java:278)
at org.opensaml.xml.parse.BasicParserPool.<init>(BasicParserPool.java:126)
Как только я начну получать ошибку, я получаю ошибку каждый раз, но я не смог выделить то, что нужно, чтобы вызвать проблему. (Редактирование: похоже, что это может быть связано каким-то образом с использованием docx4j, ошибки начинаются после запроса, который использует docx4j для генерации файла в виде словарного документа. Поскольку docx4j настолько зависит от XML, это может иметь смысл.)
В принципе, то, что делает validationNonSunJAXP(), довольно просто. Все, что он делает, это проверить имя класса для DocumentBuilderFactory, и если он начинается с "com.sun", он выдает ошибку.
Любые идеи о том, что может произойти, заставят виртуальную машину прекратить использование одобренной библиотеки?
docx4j манипулирует:
Вы можете видеть, что он делает, на странице https://github.com/plutext/docx4j/blob/master/src/main/java/org/docx4j/XmlUtils.java
javax.xml.parsers.SAXParserFactory
Таким образом, вы можете запретить docx4j касаться этого значения с помощью настроек свойств docx4j.
Мы обнаружили, что Crimson не удается проанализировать файлы docx4j XSLT, поэтому docx4j по умолчанию пытается использовать Xerces, где он включен в JDK. (В более поздних JDK может быть лучше)
Если вы не хотите этого, вы можете указать другое поведение через docx4j.properties:
Обратите внимание, что мы не восстанавливаем значение до исходного значения, так как мы хотим избежать использования Crimson для жизни приложения.
javax.xml.parsers.DocumentBuilderFactory
Это работает аналогично SAXParserFactory
Соответствующие свойства docx4j следующие:
Мы не восстанавливаем значение до его первоначальной настройки (хотя, возможно, мы могли бы: нужно было бы проверить, всегда ли docx4j использует XmlUtils.getNewDocumentBuilder())