java.lang.ClassCastException: com.ctc.wstx.stax.WstxInputFactory cannot be cast to javax.x

13-08-29 hongwei01267

bang 大神 能帮忙看个bug么?

项目是osgi项目 equinox+spring+hibernate+tapestry5 现在要用cxf生成客户端代码供调用

测试发现报 Caused by: java.lang.ClassCastException: com.ctc.wstx.stax.WstxInputFactory cannot be cast to javax.xml.stream.XMLInputFactory,

在网上百度和google了很久 有说System.setProerty 或者设置-Djavax.xml.stream.XMLInputFactory= com.ctc.wstx.stax.WstxInputFactory

可以解决 试了不行,

百度上有说是cxf和jdk1.6.4以下冲突 我换成jdk1.6.43还是不行,跟踪代码知道

public static XMLInputFactory newInstance(String factoryId,

ClassLoader classLoader)

throws FactoryConfigurationError {

try {

//do not fallback if given classloader can't find the class, throw exception

return (XMLInputFactory) FactoryFinder.newInstance(factoryId, classLoader, false);

} catch (FactoryFinder.ConfigurationError e) {

throw new FactoryConfigurationError(e.getException(),

e.getMessage());

}

}是这个里面强制转换错误,

打开-Djaxp:debug=true

发现JAXP: created new instance of class com.sun.xml.internal.stream.XMLOutputFactoryImpl using ClassLoader: null

JAXP: find factoryId =javax.xml.stream.XMLInputFactory

JAXP: found system property, value=com.ctc.wstx.stax.WstxInputFactory

JAXP: created new instance of class com.ctc.wstx.stax.WstxInputFactory using ClassLoader: null

后就包错了,

仔细查找jar包发现 项目里面有stax2.jar stax.jar woodstox-asl.jar其中里面com.ctc.wstx.stax.WstxInputFactory通过stax2.jar间接继承到stax.jar里面

javax.xml.XMLInputFactory 所以理论上来说子类向父类转换不会错啊,

但是rt.jar里面也有javax.xml.XMLInputFactory这个类 所以是不是转换的时候拿wstxinputfactory转成

rt.jar里的javax.xml.XMLInputFactory 了所以报错了啊 ,虽然能分析到此,但是没有办法解决,

网上又说可删除 woodstox-asl.jar这个包就好了 但是发现不能删除 在系统中tapestry5中有用到。

问题分析到此 我已经是山穷水尽了,,,,,,,故来求助 请指教。

banq
2013-08-29 16:28

2013-08-29 16:02 "@hongwei01267

"的内容

Caused by: java.lang.ClassCastException: com.ctc.wstx.stax.WstxInputFactory cannot be cast to javax.xml.stream.XMLInput ...

没碰到过,可以重新下载包含这个类的最新版本包:

http://woodstox.codehaus.org/Download,实在不行打开源码,修改WstxInputFactory

hongwei01267
2013-08-29 16:44

回复 banq 谢谢,修改jar包,真太难了 ,我可能做不到,能不能教我一点调试jar的方法 或者什么 调试的技巧啊。