如何解决JBoss中‘com.sun.xml.internal.messaging.saaj.soap.SAAJMetaFactoryImpl未找到’错误?
解决JBoss EAP 7.1.5.GA中SAAJ MetaFactory找不到的问题
问题分析
报错Unable to create SAAJ meta-factory: Provider com.sun.xml.internal.messaging.saaj.soap.SAAJMetaFactoryImpl not found的核心原因:
- JBoss类加载机制与JDK自带/自定义SAAJ实现存在冲突
- module.xml中存在重复、版本冲突的依赖jar,导致类加载逻辑混乱
- 未正确配置JBoss模块依赖或排除冲突的系统模块
具体解决步骤
1. 清理module.xml中的冗余/冲突依赖
你的module.xml存在大量重复和版本冲突的jar,先执行以下清理操作:
- 删除重复的
commons-io-1.3.2.jar、commons-lang3-3.12.0.jar - 保留一个版本的
javax.xml.soap-api(建议用1.4.0,适配Java EE 7),删除其他版本(如1.4.1) - 删除Jakarta命名空间的jar(如
jakarta.xml.soap-api-1.4.1.jar、jakarta.activation-api-2.1.2.jar),JBoss EAP 7.1基于Java EE 7,仅需使用javax命名空间依赖 - 保留一个版本的SAAJ实现jar(推荐
saaj-impl-1.3.16-jbossorg-1.jar,这是JBoss适配版本),删除其他版本(如saaj-impl-1.5.1.jar) - 删除冲突的激活框架jar(如
angus-activation-2.0.1.jar),使用JBoss自带的activation-1.1.jar即可
清理后的resource-root示例:
<resource-root path="MySoapWebService.jar"/> <resource-root path="commons-text-1.10.0.jar"/> <resource-root path="commons-io-1.3.2.jar"/> <resource-root path="commons-lang3-3.12.0.jar"/> <resource-root path="json.jar"/> <resource-root path="httpclient-4.5.13.jar"/> <resource-root path="httpmime-4.3.1.jar"/> <resource-root path="jackson-annotations-2.8.7.jar"/> <resource-root path="jackson-core-2.8.7.jar"/> <resource-root path="jackson-databind-2.8.7.jar"/> <resource-root path="javax.xml.soap-api-1.4.0.jar"/> <resource-root path="jersey-client-1.17.jar"/> <resource-root path="jersey-core-1.17.jar"/> <resource-root path="mail-1.4.jar"/> <resource-root path="saaj-impl-1.3.16-jbossorg-1.jar"/> <resource-root path="activation-1.1.jar"/> <resource-root path="mimepull-1.9.7.jar"/> <resource-root path="stax-api-1.0-2.jar"/> <resource-root path="stax-ex-2.1.0.jar"/> <resource-root path="saaj-api-1.3.5.jar"/>
2. 修正模块依赖配置
在module.xml的<dependencies>节点中,添加JBoss自带的SAAJ相关模块,替换原有的javaee.api(避免过度依赖):
<dependencies> <module name="javax.api"/> <module name="javax.xml.soap.api"/> <module name="com.sun.xml.messaging.saaj"/> <module name="javax.activation.api"/> </dependencies>
3. 排除JBoss自带的冲突模块(可选)
如果清理依赖后仍报错,可在部署包的WEB-INF/jboss-deployment-structure.xml(无则新建)中排除JBoss自带的SAAJ模块,强制使用自定义实现:
<jboss-deployment-structure> <deployment> <exclusions> <module name="javax.xml.soap.api"/> <module name="com.sun.xml.messaging.saaj"/> </exclusions> </deployment> </jboss-deployment-structure>
4. 检查SAAJ实现的服务配置
确保使用的saaj-impljar中存在META-INF/services/javax.xml.soap.SAAJMetaFactory文件,文件内容需对应实现类:
- 若用Sun的实现:
com.sun.xml.messaging.saaj.soap.SAAJMetaFactoryImpl - 若用JBoss适配版本:
org.jboss.ws.saaj.SAAJMetaFactoryImpl
5. 调整代码中的MessageFactory初始化
将MessageFactory.newInstance()改为指定SOAP版本,避免默认逻辑冲突:
import javax.xml.soap.MessageFactory; import javax.xml.soap.SOAPConstants; MessageFactory factory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL); // 或根据需求选择SOAP_1_2_PROTOCOL
内容的提问来源于stack exchange,提问作者MariusB.
相关产品推荐
相关产品推荐

