我在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停止使用支持的库?
答案 0 :(得分:1)
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())