记一次 cxf 的 Cannot create a secure XMLInputFactory

昨天按计划发个版本,本想着应该非常顺利,可是没想到,居然出现了 Cannot create a secure XMLInputFactory,心中一万个CNM

这次的改动都没有动过古董级的ws相关代码,这是怎么回事。

一顿百度、google。。。。。。

## https://www.cnblogs.com/natsu72/p/7530784.html

首先看到的是这篇文章,感觉好像很有道理,就去分析发布的包,里面的lib基本都没问题,

cxf-core-3.1.10.jar

woodstox-core-asl-4.4.1.jar

stax2-api-3.1.4.jar

继续寻找

## 问题出处在这里

具体情况应该是

XMLInputFactory.newInstance();

根据以前的经验,XMLInputFactory应该是类似log框架一样的加载原理,在classpath中搜索实现类(总结归纳确实很重要,平常没有积累,不知道怎么描述了),看了一下实现类,似乎也没发现一样

## 再次搜索(原始链接已丢失)

基本原理也是如源码中的一样,只需空中allowInsecureParser=true即可

因此,配置了一个容器listener

```

public class ApiFixListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        log.error("---need fix---" + JdkVersion.getJavaVersion());
        if (JdkVersion.getMajorJavaVersion() < JdkVersion.JAVA_18) {
            Properties props = System.getProperties();
            props.setProperty("org.apache.cxf.stax.allowInsecureParser", "1");
            props.setProperty("UseSunHttpHandler", "true");
        }
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {

    }
}

再发布试试,结果,还是没什么用

## 痛定思痛,再搜索 http://www.programmersought.com/article/5789964138/

同事也说过之前的版本没问题,很有可能是这次改动引起的,加上基本没改到发生异常的这里,自己也感觉是包依赖的问题导致的,再查了下线上版本的日志,发现也有类似的日志,只是没有引起崩溃而已

Could not create a secure Stax XMLInputFactory. Found class com.ctc.wstx.stax.WstxInputFactory. Suggest Woodstox 4.2.0 or newer.

通过intellij ide强大的Diagrams功能,查看依赖关系

尝试着添加排除项,如下到pom.xml中

<dependency>
	<groupId>org.apache.neethi</groupId>
	<artifactId>neethi</artifactId>
	<exclusions>
		<exclusion>
			<groupId>org.codehaus.woodstox</groupId>
			<artifactId>wstx-asl</artifactId>
		</exclusion>
		<exclusion>
			<groupId>wsdl4j</groupId>
			<artifactId>wsdl4j</artifactId>
		</exclusion>
	</exclusions>
</dependency>

这次确实是解决了问题

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章