我有以下代码:
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
XMLStreamReader xmlStreamReader = inputFactory.createXMLStreamReader(inStream);
this.encoding = xmlStreamReader.getEncoding();
...
这段代码在JBoss和Websphere中都可以正常运行,但是在特定的JBoss中会引发以下异常:
java.lang.ClassCastException: com.ctc.wstx.stax.WstxInputFactory cannot be cast to javax.xml.stream.XMLInputFactory
at javax.xml.stream.XMLInputFactory.newInstance(XMLInputFactory.java:136)
at es.gema.core.shared.dim.data.XFacturaE.detectVersion(XFacturaE.java:115)
at es.gema.core.shared.dim.data.XFacturaE.<init>(XFacturaE.java:67)
at es.gema.core.shared.dim.bc.InvoiceLoader.readXMLInvoice(InvoiceLoader.java:544)
at es.gema.core.shared.dim.bc.InvoiceLoader.loadInvoiceFACE(InvoiceLoader.java:137)
at es.gema.core.expenses.fac.bc.InvoiceServicesBC.execute(InvoiceServicesBC.java:127)
at es.gema.core.expenses.fac.bc.InvoiceServicesBC.execute(InvoiceServicesBC.java:92)
检查WstxInputFactory我看到它扩展了XMLInputFactory2而不是XMLInputFactory。
在这种情况下,推荐的方法是什么?在不使用工厂的情况下创建WstxInputFactory的实例,或配置Java容器以返回扩展XMLInputFactory的解析器。
最佳答案
public abstract class XMLInputFactory2
extends javax.xml.stream.XMLInputFactory
因此,
com.ctc.wstx.stax.WstxInputFactory
确实扩展了javax.xml.stream.XMLInputFactory
,因此必须可转换为它。但是,由于您遇到了此异常,因此您肯定遇到了类加载器问题。确保
javax.xml.stream.XMLInputFactory
由相同的类加载器加载。 JBoss/JDK可能提供了一个,并且您的应用程序在类路径中也有一个StAX。但是很难确切地说出谁是有罪的。