You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quarkus中@ConfigProperty无法为普通类字段注入配置值如何解决

Quarkus @ConfigProperty 自定义类注入失败排查方案

核心原因

注入失败由几个常见的CDI使用不规范问题导致:

  1. 自定义Temp类没有被Quarkus CDI容器托管,容器不会处理其内部的注入注解
  2. 待注入字段使用了static修饰,CDI默认不支持静态字段注入
  3. 若手动通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 15:36:02