背景
突然有一天用cxf调用webservice接口报错了,错误信息如下
代码使用springboot 2.3.12.RELEASE cxf 3.5.1
排查过程
1.根据关键字搜索发现个帖子 CXF web service client: "Cannot create a secure XMLInputFactory" 有两个关键信息 a. system properties加个org.apache.cxf.stax.allowInsecureParser=1 b. 加上两个依赖 stax2-api and woodstox-core-asl, exclude stax-api wstx-asl
2.根据上面的线索在springboot启动类里添加如下代码
@PostConstruct
public void init() {
System.setProperty(StaxUtils.ALLOW_INSECURE_PARSER,"1");
}
3.修改pom.xml
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-core</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>org.codehaus.woodstox</groupId>
<artifactId>woodstox-core-asl</artifactId>
<version>4.4.1</version>
<exclusions>
<exclusion>
<groupId>javax.xml.stream</groupId>
<artifactId>stax-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.codehaus.woodstox</groupId>
<artifactId>stax2-api</artifactId>
<version>4.2.1</version>
</dependency>
然后用idea的Dependency Analysis Graph 看看有没冲突的依赖
4.一顿操作后更新上线->请求->GG还是一样的错误信息
5.期间试过很多种办法,还是一样的异常 记一次 cxf 的 Cannot create a secure XMLInputFactory 解决CXF webService 调用报错: “Cannot create a secure XMLInputFactory” Spring项目整合WebService服务遇到问题记录
6.最终想着是不是接口提供方的问题,刚发现问题的时候是有问过的服务端是升级过的,服务端cxf从2.7升级到3.2.6 于是将cxf依赖版本也改成3.2.6, woodstox-core-asl改成4.4.1 stax2-api改成3.1.4,再次更新照样失败
7.因为不能直接请求接口,不能调试,所以让接口提供方自己请求自己的接口试下有没什么问题。 然后收到通知让我再试一下,再试成功了!!问了一下做了什么改动,服务端加上System.setProperty("org.apache.cxf.stax.allowInsecureParser","1"); 这个了
8.结束
结论
1.pom.xml
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-core</artifactId>
<version>3.2.6</version>
<exclusions>
<exclusion>
<groupId>com.fasterxml.woodstox</groupId>
<artifactId>woodstox-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.2.6</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.2.6</version>
</dependency>
<dependency>
<groupId>org.codehaus.woodstox</groupId>
<artifactId>stax2-api</artifactId>
<version>3.1.4</version>
</dependency>
<dependency>
<groupId>org.codehaus.woodstox</groupId>
<artifactId>woodstox-core-asl</artifactId>
<version>4.4.1</version>
<exclusions>
<exclusion>
<artifactId>stax-api</artifactId>
<groupId>javax.xml.stream</groupId>
</exclusion>
</exclusions>
</dependency>
2.启动类加上
@PostConstruct
public void init() {
System.setProperty(StaxUtils.ALLOW_INSECURE_PARSER,"1");
}
3.服务端 加上类似System.setProperty(StaxUtils.ALLOW_INSECURE_PARSER,"1")的配置
注意:本文归作者所有,未经作者允许,不得转载