昨天按计划发个版本,本想着应该非常顺利,可是没想到,居然出现了 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>
这次确实是解决了问题