WildFly中资源适配器连接工厂注入类型转换问题求助
解决WildFly中资源适配器API重复导致的类型转换异常问题
问题根源
核心原因是类加载器隔离机制:RAR和WAR模块各自加载了同一份API接口(如BarrierConnectionFactory),导致两个模块中的该接口属于不同的类加载器实例,即使全类名相同,JVM也会判定为不同类型,从而引发强转异常。
简洁替代方案(无需jboss-deployment-structure.xml)
1. 将API抽为独立WildFly模块
这是最通用的方案,适合API需要被多个部署共享的场景:
- 把
BarrierConnectionFactory等API接口单独打包成barrier-api.jar - 在WildFly的
modules/system/layers/base下创建对应路径(如com/example/barrier/api/main),放入barrier-api.jar,并编写module.xml:<?xml version="1.0" encoding="UTF-8"?> <module name="com.example.barrier.api" xmlns="urn:jboss:module:1.9"> <resources> <resource-root path="barrier-api.jar"/> </resources> <dependencies> <!-- 添加API依赖的其他模块,比如javax.resource.api等 --> <module name="javax.resource.api" slot="main"/> </dependencies> </module> - 在RAR的
MANIFEST.MF中添加依赖:Dependencies: com.example.barrier.api - 在WAR的
MANIFEST.MF中添加同样的依赖,确保两者使用同一类加载器加载的API类。
2. WAR直接依赖RAR的API(仅当前部署共享)
如果API只需要在当前的RAR和WAR之间共享,可通过MANIFEST.MF直接关联:
- 在WAR的
MANIFEST.MF中添加:Dependencies: deployment.[你的RAR文件名].rar
例如RAR文件名为barrier-ra.rar,则写为Dependencies: deployment.barrier-ra.rar - 此配置会让WAR直接使用RAR模块中的API类,避免重复加载,无需额外的XML配置。
3. 配置全局模块(多应用共用API)
如果该API是多个部署应用的公共依赖,可将其设为WildFly全局模块:
- 先按方案1创建独立的API模块
- 修改WildFly的
standalone.xml(或domain.xml),在ee子系统中添加全局模块:<subsystem xmlns="urn:jboss:domain:ee:5.0"> <global-modules> <module name="com.example.barrier.api" slot="main"/> </global-modules> <!-- 其他子系统配置 --> </subsystem> - 重启WildFly后,所有部署的应用都会自动加载该全局模块的API类,RAR和WAR无需额外配置。
内容的提问来源于stack exchange,提问作者mr mcwolf
相关产品推荐
相关产品推荐

