org.apache.cxf.binding.soap.SoapFault: Cannot create a secure XMLInputFactory

大老板 1年前 ⋅ 577 阅读

背景

突然有一天用cxf调用webservice接口报错了,错误信息如下 cxf.png

代码使用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")的配置


全部评论: 0

    我有话说: