Apache Deltaspike @ConfigProperty在Jakarta EE10/WildFly 27 Final中失效
核心问题
迁移至Jakarta EE10(WildFly 27 Final、Java 17)后,原Apache Deltaspike的@Inject @ConfigProperty注入失效,报错显示WELD无法匹配依赖:容器识别到SmallRye Config的生产者(io.smallrye.config.inject.ConfigProducer),但注入点的@Default限定符与生产者的@Any @ConfigProperty限定符不匹配,同时存在Deltaspike与Jakarta EE10内置配置规范的兼容性冲突。
原因拆解
- 注解混淆:Apache Deltaspike的
@ConfigProperty(org.apache.deltaspike.core.api.config.ConfigProperty)与WildFly内置SmallRye/Jakarta Config的@ConfigProperty重名,容器优先加载了SmallRye的实现,导致原有Deltaspike注入逻辑失效。 - 版本不兼容:旧版Deltaspike未适配Jakarta EE10的API规范,无法在新容器环境中正常工作。
- 限定符不匹配:注入点标注的
@Default限定符,与SmallRye Config生产者的限定符集合不匹配,导致依赖查找失败。
解决方案
方案1:继续使用Apache Deltaspike配置
步骤1:升级Deltaspike版本
使用适配Jakarta EE10的Deltaspike 2.1.x及以上版本,更新项目依赖(以Maven为例):
<dependency> <groupId>org.apache.deltaspike.core</groupId> <artifactId>deltaspike-core-api</artifactId> <version>2.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.deltaspike.core</groupId> <artifactId>deltaspike-core-impl</artifactId> <version>2.1.0</version> <scope>runtime</scope> </dependency>
步骤2:明确注解导入
确保代码中@ConfigProperty的导入为Deltaspike的包:
import org.apache.deltaspike.core.api.config.ConfigProperty;
步骤3:排除容器内置配置(可选)
若仍存在冲突,在jboss-deployment-structure.xml中排除WildFly的SmallRye Config子系统:
<jboss-deployment-structure> <deployment> <exclude-subsystems> <subsystem name="microprofile-config-smallrye"/> </exclude-subsystems> </deployment> </jboss-deployment-structure>
方案2:改用Jakarta EE10标准配置(推荐)
直接使用Jakarta Config规范替代Deltaspike,适配容器原生支持:
步骤1:替换注解与用法
移除@Default,改用Jakarta Config的@ConfigProperty并通过defaultValue设置默认值:
import jakarta.config.ConfigProperty; import jakarta.enterprise.context.RequestScoped; import jakarta.inject.Inject; import jakarta.inject.Logger; @RequestScoped public class KbMaxConnector { @Inject @ConfigProperty(name = "kbmax.url", defaultValue = "") private String url; @Inject @ConfigProperty(name = "kbmax.email", defaultValue = "") private String email; @Inject @ConfigProperty(name = "kbmax.password", defaultValue = "") private String password; @Inject private Logger LOGGER; public KBMaxModelsQuote getQuote(Integer quoteId) throws ApiException { LOGGER.debug("Calling KbMax quote api with quoteId: {}, on url:{} user: {} password: {}",quoteId,url,email,password); QuotesApi quotesApi = new QuotesApi(url, email, password); return quotesApi.apiQuotesByIdGet(quoteId); } }
步骤2:移除Deltaspike依赖
删除项目中所有Deltaspike相关的依赖配置,直接使用WildFly内置的SmallRye Config实现。
方案3:修复限定符匹配(临时兼容)
若需保留原有代码结构且切换至SmallRye Config,移除注入点的@Default限定符:
@Inject @ConfigProperty(name = "kbmax.url") private String url;
注:此方式仅适用于放弃Deltaspike、改用SmallRye Config的场景。
验证步骤
- 清理项目构建缓存(如
target目录) - 重新部署至WildFly 27
- 检查日志是否仍存在WELD注入错误
内容的提问来源于stack exchange,提问作者Gerry Askefalk

