OpenSAML XML分析程序配置的随机错误

时间:2015-03-16 19:42:46

标签: java xml tomcat docx4j opensaml

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

[ajp-apr-8009-exec-22] DEBUG org.opensaml.xml.Configuration - 使用JAXP解析器的VM 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的类名,如果它以&#34; com.sun&#34;开头,它会抛出错误。

关于可能发生什么的任何想法都会导致VM停止使用支持的库?

1 个答案:

答案 0 :(得分: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())