运行时确定StAX解析器

时间:2014-11-26 11:35:02

标签: java xml jboss stax

我有以下代码:

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的解析器?

3 个答案:

答案 0 :(得分:5)

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。但很难确切地告诉谁有罪。

答案 1 :(得分:2)

<强>问题: 我得到了以下错误。我的服务器是“jboss-eap-5.1.1”,JDK 1.6。

  

java.lang.ClassCastException:com.ctc.wstx.stax.WstxOutputFactory无法强制转换为javax.xml.stream.XMLOutputFactory

<强>解决方案: 我已经删除了“stax”库,确切地说:

<exclusions>
    <exclusion>
        <groupId>javax.xml.stream</groupId>
        <artifactId>stax-api</artifactId>
    </exclusion>
</exclusions>

答案 2 :(得分:0)

将stax-api排除在外的解决方案在使用Microsoft文档的Java Apache POI API 时效果很好。

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.15</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.15</version>
    <exclusions>
        <exclusion>
            <groupId>stax</groupId>
            <artifactId>stax-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>