xml 使用 StAX 验证:无法识别 属性 'javax.xml.stream.isInterning'

xml validation with StAX: Unrecognized property 'javax.xml.stream.isInterning'

我正尝试在我们的 jboss 网络应用程序中使用 StAX 进行 xml 验证。我已阅读 this post 并按照示例进行操作。然后我看到以下异常:

java.lang.IllegalArgumentException: Source parameter of type      
javax.xml.transform.stax.StAXSource' is not accepted by this validator.
at org.apache.xerces.jaxp.validation.ValidatorImpl.validate(Unknown Source)

根据this post,这里的问题是jboss 5.0.1 有一个旧版本的xerces。所以我通过替换 jboss-5.0.1.GA/lib/endorsed/ 下现有的 xercesImpl.jar 将其升级到 2.11.0。然后 jboss 将无法启动,因为出现以下错误:

NoClassDefFoundError: org/w3c/dom/ElementTraversal

根据 this post, in newer versions of xerces the classes have been split out to a separate jar file: xml-apis.jar . I took the latest version of that file (1.4.01, dated December 2009) from the xerces homepage 并将其添加到 jboss-5.0.1.GA//lib/endorsed/ - 现在 jboss 开始正常。

到目前为止一切顺利。

但现在我在尝试调用 javax.xml.validation.Validator.validate() 方法时看到以下错误:

java.lang.IllegalArgumentException: Unrecognized property 'javax.xml.stream.isInterning'

关于属性的SO似乎不存在问题。当然,我不可能是唯一一个尝试在 jboss 5 上使用 StAX 进行 xml 验证的人?!

还是我做错了什么?

代码片段:

 Validator validator = requestSchema.newValidator();  
 StAXSource source = new StAXSource(xmlsr);  //an XMLStreamReader
 validator.validate(source); 

我们找到了解决此问题的两种方法。

一个选项是将 XmlStreamReader 薄包装在一个新的 class 中,如果参数为 "javax.xml.stream.isInterning",它将忽略 getProperty 调用,否则将其委托。

另一种选择是改用 XmlEventReader,它的性能较低但无需自定义包装器即可工作。