我尝试使用StAX和javax Validator验证XML但是我收到了以下强制转换错误:
org.xml.sax.SAXException: java.lang.ClassCastException: org.codehaus.stax2.ri.evt.NamespaceEventImpl cannot be cast to java.lang.String
javax.xml.transform.TransformerException: java.lang.ClassCastException: org.codehaus.stax2.ri.evt.NamespaceEventImpl cannot be cast to java.lang.String
基本思想是我需要使用StAX解析XML,并尝试重用我将用于解析和创建StAXSource以执行验证的事件阅读器。
我能够调试错误并将强制转换异常跟踪到类com.sun.org.apache.xalan.internal.xsltc.trax.StAXEvent2SAX,第341行,其中有一个循环通过迭代器和一个转换器实际上迭代器的类型为NamespaceEventImpl(下面代码部分的代码片段),实际上是一个String。
// end namespace bindings
for( Iterator i = event.getNamespaces(); i.hasNext();) {
String prefix = (String)i.next();
if( prefix == null ) { // true for default namespace
prefix = "";
}
_sax.endPrefixMapping(prefix);
}
以下是迭代器的内容" i"在执行逻辑时,我指的是: iterator content
下面是一段代码,描述了我是如何做到的。
public void validateRequest(RequestMessage message) {
try {
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLEventReader eventReader = factory.createXMLEventReader(new ByteArrayInputStream(message.getMessage().getBytes()));
this.validateSchema(eventReader);
if(this.isSchemaValid()) {
// parse through XML
}
} catch(Exception e) {
LOGGER.error(e.getMessage(), e);
}
}
private void validateSchema(XMLEventReader eventReader) {
try {
StAXErrorHandler errorHandler = new StAXErrorHandler();
this.validator.setErrorHandler(errorHandler);
this.validator.validate(new StAXSource(eventReader));
} catch (SAXException | IOException | XMLStreamException e) {
LOGGER.error(e.getMessage(), e);
}
}
我想知道之前是否有人遇到此问题,以及是否将StAXSource与Validator本身一起使用是有限制的。