【问题标题】:Random error with OpenSAML XML Parser ConfigurationOpenSAML XML 解析器配置的随机错误
【发布时间】:2015-03-16 19:42:46
【问题描述】:

我在 Tomcat 8 中运行一个使用 OpenSAML 的 webapp。我已经在 Tomcat 中认可了 Xerces,我已经检查了认可的 dir 路径是否设置正确,看来一切正常:

[ajp-apr-8009-exec-22] 调试 org.opensaml.xml.Configuration - VM 使用 JAXP 解析器 org.apache.xerces.jaxp.DocumentBuilderFactoryImpl

我收到了几个运行良好的请求,一切看起来都很好,我可以毫无错误地运行那段代码,然后突然之间,我开始收到这个错误:

OpenSAML 需要一个支持 JAXP 1.3 和 DOM3 的 xml 解析器。 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 将文件生成为 word 文档的请求之后开始。由于 docx4j 非常依赖 XML,这可能是有道理的。)

基本上,validateNonSunJAXP() 所做的非常简单。它所做的只是检查 DocumentBuilderFactory 的类名,如果它以“com.sun”开头,则会引发错误。

有什么想法会导致 VM 停止使用认可的库吗?

【问题讨论】:

    标签: java xml tomcat docx4j opensaml


    【解决方案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 中。 (在最近的 JDK 中情况可能会更好)

    如果你不想这样,你可以通过 docx4j.properties 指定不同的行为:

    • docx4j.javax.xml.parsers.SAXParserFactory.donotset=true 停止 docx4j 更改设置,或
    • javax.xml.parsers.SAXParserFactory 允许您指定您想要的内容

    请注意,我们不会将值恢复为其原始设置,因为我们希望避免在应用程序的整个生命周期中使用 Crimson。

    javax.xml.parsers.DocumentBuilderFactory

    这类似于 SAXParserFactory

    相关的docx4j属性如下:

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

    我们不会将值恢复到其原始设置(尽管也许我们可以;需要检查 docx4j 是否总是使用 XmlUtils.getNewDocumentBuilder() )

    【讨论】:

    • 因此,根据您对 validateNonSunJAXP() 的描述,调整两个 docx4j DocumentBuilderFactory 属性之一应该可以满足您的需求。
    • 谢谢,这正是问题所在。为 DocumentBuilderFactory 启用 donotset 可以解决问题。 OpenSAML 似乎仍然过时,假设 JDK 提供的 JAXP 库有问题,因为至少在 Sun/Oracle JDK 中,他们已经嵌入 Xerces 一段时间了,只是嵌入的 xerces 在“com.sun”下.org.apache.xerces”,因此即使是 xerces,它也无法通过测试(只是寻找“com.sun”),理论上它应该可以工作。
    • 在集成的早期,JDK 中重新打包的 xerces 不完整/过时。这些天情况可能会好一些。见blogs.oracle.com/joew/entry/jaxp_xml_in_the_jdk
    • @JasonPlutext,这两个属性互斥有什么原因吗?如果能够在不覆盖系统属性的情况下设置 docx4j 的 SAXParserFactory,那就太好了。
    猜你喜欢
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 2011-03-19
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    相关资源
    最近更新 更多