升级项目至Java 15后启动服务器时出现SAAJ元工厂提供者缺失的Bean创建错误
解决Java 15下SAAJ MetaFactory找不到的Bean创建错误
问题分析
你遇到的这个错误本质上是Java 9引入模块化系统后,原有的com.sun.xml.internal开头的内部API被移除或不再默认暴露导致的。虽然你已经添加了saaj-impl依赖,但JVM默认还是在找旧的internal路径下的实现类,而新版本的saaj-impl已经将包名调整为com.sun.xml.messaging.saaj(去掉了internal),所以出现了路径不匹配的问题。
解决方案
下面是几个针对性的解决步骤,你可以按顺序尝试:
1. 添加JVM启动参数指定SAAJ元工厂实现
直接告诉JVM要使用saaj-impl中的实现类,在服务器启动的JVM参数里加上:
-Djavax.xml.soap.SAAJMetaFactory=com.sun.xml.messaging.saaj.soap.SAAJMetaFactoryImpl
这个参数会覆盖JVM默认的查找逻辑,强制使用你引入的saaj-impl里的实现类。
2. 确保依赖版本适配Java 15
你用的saaj-impl:2.0.0是支持Java 9+的,但如果后续还有问题,可以尝试升级到更稳定的版本,比如2.1.3(目前的稳定版),依赖声明如下:
compile group: 'com.sun.xml.messaging.saaj', name: 'saaj-impl', version: '2.1.3'
3. 模块化项目额外配置(如果你的项目用了module-info.java)
如果你的项目是模块化的,需要在module-info.java中声明对saaj-impl模块的依赖:
module your.module.name { requires com.sun.xml.messaging.saaj; // 如果用到Spring相关模块,也要确保相应的requires声明 requires spring.web.services; }
4. 排除冲突依赖
检查你的项目依赖树,看看是否有旧版本的saaj-api、javax.xml.soap-api或者其他JAX-WS相关依赖和saaj-impl冲突。比如如果有旧的saaj-api,可以在依赖中排除它:
compile group: 'com.sun.xml.messaging.saaj', name: 'saaj-impl', version: '2.1.3' { exclude group: 'javax.xml.soap', name: 'saaj-api' }
验证
启动服务器前确认上述配置都已生效,然后重新启动,Bean创建错误应该就能解决了。这个问题在Java 9到Java 17之间的版本都比较常见,核心就是让JVM正确加载非internal路径的SAAJ实现。
内容的提问来源于stack exchange,提问作者hemantSingh
相关产品推荐
相关产品推荐

