Я запускаю webapp в Tomcat 8, который использует OpenSAML. Я одобрил Xerces в Tomcat, я проверил, что одобренный путь пути установлен правильно, кажется, что все работает нормально:Случайная ошибка с конфигурацией Parser для OpenSAML
[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. Пожалуйста, поддержите функциональную библиотеку (ы), например Xerces и Xalan, библиотеки JAXP. Инструкции о том, как поддержать новый парсер см 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, это может иметь смысл.)
В принципе, что validateNonSunJAXP() делает довольно просто. Все, что он делает, это проверить имя класса для DocumentBuilderFactory, и если он начинается с «com.sun», он выдает ошибку.
Любые идеи о том, что может произойти, приведет к тому, что виртуальная машина перестанет использовать одобренную библиотеку?
Итак, основываясь на вашем описании validateNonSunJAXP(), настройка одного из двух свойств docx4j DocumentBuilderFactory должна предоставить вам то, что вам нужно. – JasonPlutext
Спасибо, это была именно проблема. Включение метода donotset для DocumentBuilderFactory решает проблему. OpenSAML, похоже, по-прежнему действительно устарел в предположении, что JAXP-библиотеки JAXP, базирующиеся на JDK, ошибочны, потому что, по крайней мере, с помощью Sun/Oracle JDK они встраивают Xerces на некоторое время, просто встроенные xerces находятся под «com.sun .org.apache.xerces ", поэтому он не проходит тест (просто ищет« com.sun »), даже если это ксероны, которые должны теоретически работать. – jfhfmn
Переупаковка xerces в JDK была неполной/устаревшей, в первые дни интеграции. В наши дни все возможно лучше; см. https://blogs.oracle.com/joew/entry/jaxp_xml_in_the_jdk – JasonPlutext