2015-03-16 2 views
1

Я запускаю 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», он выдает ошибку.

Любые идеи о том, что может произойти, приведет к тому, что виртуальная машина перестанет использовать одобренную библиотеку?

ответ

1

docx4j манипулирует:

  • javax.xml.parsers.SAXParserFactory
  • javax.xml.parsers.DocumentBuilderFactory
  • javax.xml.transform.TransformerFactory

Вы можете увидеть, что это, на 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. (Вещи могут быть лучше в более поздних JD)

Если вы не хотите этого, вы можете указать другое поведение с помощью docx4j.properties:

  • docx4j.javax.xml.parsers.SAXParserFactory.donotset = true останавливает docx4j от изменения настройки, или
  • javax.xml.parsers.SAXParserFactory позволяет указать, что вы хотите

Обратите внимание, что мы не восстановить значение в свое первоначальное положение, так как мы хотим, чтобы избежать Багровый используется для жизни приложения.

javax.xml.parsers.DocumentBuilderFactory

Это работает аналогично SAXParserFactory

Соответствующие свойства docx4j заключаются в следующем:

  • docx4j.javax.xml.parsers.DocumentBuilderFactory. donotset
  • javax.xml.parsers.DocumentBuilderFactory

Мы не восстанавливаем значение до его первоначальной настройки (хотя, возможно, мы могли; нужно было бы проверить, всегда ли docx4j использует XmlUtils.getNewDocumentBuilder())

+0

Итак, основываясь на вашем описании validateNonSunJAXP(), настройка одного из двух свойств docx4j DocumentBuilderFactory должна предоставить вам то, что вам нужно. – JasonPlutext

+0

Спасибо, это была именно проблема. Включение метода donotset для DocumentBuilderFactory решает проблему. OpenSAML, похоже, по-прежнему действительно устарел в предположении, что JAXP-библиотеки JAXP, базирующиеся на JDK, ошибочны, потому что, по крайней мере, с помощью Sun/Oracle JDK они встраивают Xerces на некоторое время, просто встроенные xerces находятся под «com.sun .org.apache.xerces ", поэтому он не проходит тест (просто ищет« com.sun »), даже если это ксероны, которые должны теоретически работать. – jfhfmn

+0

Переупаковка xerces в JDK была неполной/устаревшей, в первые дни интеграции. В наши дни все возможно лучше; см. https://blogs.oracle.com/joew/entry/jaxp_xml_in_the_jdk – JasonPlutext

Смежные вопросы