Quarkus从application.properties注入自定义属性为null如何解决?
问题原因
CDI(Quarkus使用的依赖注入框架)的字段注入逻辑是在类的实例化完成之后才执行的,构造方法执行时,注入流程还未触发,因此你声明的API_KEY字段此时还未被赋值,必然为null。你调整字段上的@Inject注解无法解决问题,本质是字段注入的执行时机晚于构造方法执行时机。
修复方案
方案1:使用构造方法注入(推荐)
直接将配置属性作为构造方法的参数传入,依赖注入容器会在实例化类时自动把配置值注入到构造参数中,你可以直接在构造方法中使用该值,示例代码如下:
@ApplicationScoped public class EmailConfig { private final String API_KEY; private SendGrid sendGrid; private Request request; // 单构造方法场景下可省略@Inject注解 public EmailConfig(@ConfigProperty(name = "sendgrid.apikey") String apiKey) { this.API_KEY = apiKey; sendGrid = new SendGrid(API_KEY); request = new Request(); } }
方案2:使用@PostConstruct初始化方法
你可以保留原有字段注入的写法,将依赖注入字段的初始化逻辑放到@PostConstruct注解标注的方法中,该方法会在字段注入完成后被容器自动调用,此时字段已经完成赋值:
@ApplicationScoped public class EmailConfig { @Inject @ConfigProperty(name = "sendgrid.apikey") String API_KEY; private SendGrid sendGrid; private Request request; public EmailConfig() { // 构造方法中不执行依赖注入字段相关的初始化逻辑 } @PostConstruct public void init() { sendGrid = new SendGrid(API_KEY); request = new Request(); } }
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

