Quarkus中@ConfigProperty无法为普通类字段注入配置值如何解决
Quarkus @ConfigProperty 自定义类注入失败排查方案
核心原因
注入失败由几个常见的CDI使用不规范问题导致:
- 自定义
Temp类没有被Quarkus CDI容器托管,容器不会处理其内部的注入注解 - 待注入字段使用了
static修饰,CDI默认不支持静态字段注入 - 若手动通过
new Temp()创建实例,即使类配置了注解,手动创建的对象也不受容器管理,不会触发注入
排查及修复步骤
- 第一步:给自定义类添加CDI作用域注解,将其纳入容器托管范围,常用注解包括
@ApplicationScoped(全局单例)、@RequestScoped(请求级实例)、@Singleton(静态单例) - 第二步:删除待注入字段的
static修饰符,搭配@Inject和@ConfigProperty注解使用 - 第三步:在需要使用该类的位置,通过
@Inject注入托管实例,禁止手动new创建对象
修复后代码示例
自定义Temp类
import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import org.eclipse.microprofile.config.inject.ConfigProperty; @ApplicationScoped public class Temp { @Inject @ConfigProperty(name = "secret.token") String SECRET_KEY; public void display() { System.out.println(SECRET_KEY); } }
调用方式示例
// 以Controller层调用为例 @Path("/test") public class TestController { // 注入托管实例,不要手动new Temp() @Inject Temp temp; @GET public String testConfig() { temp.display(); return "配置读取成功"; } }
特殊场景:需要静态持有配置值
如果业务场景必须使用静态字段存储配置,可以跳过注入逻辑,主动调用配置API读取:
import org.eclipse.microprofile.config.ConfigProvider; public class Temp { // 主动读取配置,无需类被容器托管 static final String SECRET_KEY = ConfigProvider.getConfig().getValue("secret.token", String.class); public void display() { System.out.println(SECRET_KEY); } }
内容的提问来源于stack exchange,提问作者sadique urf arbaz
相关产品推荐
相关产品推荐

