CXF2升级到3兼容spring4会遇到的问题

部署情况:A服务器需要调用B服务器的WebService服务。
版本情况:A服务器和B服务器都是cxf 2.3.0 加spring3,WebService调用相关包路径一致。

升级需求:A服务器需要升级到spring4,WebService调用相关包路径不一致,B服务器不动。
遇到问题:升级A服务器的相关jar文件之后,测试WebService调用时遇到错误:
java.lang.RuntimeException: Cannot create a secure XMLInputFactory
    at org.apache.cxf.staxutils.StaxUtils.createXMLInputFactory(StaxUtils.java:338)
    at org.apache.cxf.staxutils.StaxUtils.getXMLInputFactory(StaxUtils.java:278)
    at org.apache.cxf.staxutils.StaxUtils.createXMLStreamReader(StaxUtils.java:1829)
    at org.apache.cxf.configuration.spring.JAXBBeanFactory.createJAXBBean(JAXBBeanFactory.java:46)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at  org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162)
查询网上的相关文章,有以下解决办法(可以解决问题,但是有个别文章不建议使用该方法):

Properties props = System.getProperties();
props.setProperty("org.apache.cxf.stax.allowInsecureParser", "1");
props.setProperty("UseSunHttpHandler", "true");
从项目长远考虑,还是不采用这种非常规方法,经仔细对比包的情况,发现以下解决方案:
1、首先要确保 woodstox以及stax相关包升级到了最新,cxf 3.2.4对应的是:stax2-api-3.0.2.jar和woodstox-core-asl-4.0.8.jar
2、确保老版本的以woodstox以及stax文件名开头的jar已被清理。
3、有一个非常隐蔽的包:以 wstx文件名开头的jar也需要清理,其实就是早期woodstox版本,我本地是wstx-asl-3.2.7.jar

第1、2两步大部分网上的介绍都会提到,困扰我最久的是第3步,是经自己慢慢的试探才找出来的。

猜你喜欢

转载自blog.csdn.net/paoma_1008/article/details/80493565