Quarkus项目@ConfigProperty注入String遇UnsatisfiedResolutionException报错
解决Quarkus中@ConfigProperty注入String类型时的UnsatisfiedResolutionException错误
问题根源
报错信息明确指向ConfigWebScraperBuilder()构造函数的webScraperClassName参数无法解析,核心原因:
- 被
@ApplicationScoped注解的类定义了带参数的构造函数时,CDI容器会优先尝试通过该构造函数创建Bean实例,而非字段注入。 - 构造函数中的
String参数未添加任何注入注解(如@ConfigProperty),CDI找不到对应的java.lang.String类型默认Bean,因此抛出UnsatisfiedResolutionException。
解决方案
有两种可行的修复方式:
方案1:添加无参构造函数
让CDI容器通过无参构造函数创建实例,保留字段注入逻辑:
@ApplicationScoped public class ConfigWebScraperBuilder { @ConfigProperty(name = "bot.webscraper.className") String webScraperClassName; // 添加无参构造函数,供CDI容器实例化使用 public ConfigWebScraperBuilder() {} public ConfigWebScraperBuilder(String webScraperClassName) { this.webScraperClassName = webScraperClassName; } public WebScraper buildWebScraperFromConfig() throws Exception { Class<?> clazz = Class.forName(webScraperClassName); Constructor<?> constructor = clazz.getConstructor(ParserAdapter.class); return (WebScraper) constructor.newInstance(new ParserAdapter()); } }
方案2:构造函数参数直接注入配置(推荐)
符合CDI构造注入规范,避免字段注入的潜在问题:
@ApplicationScoped public class ConfigWebScraperBuilder { private final String webScraperClassName; // 在构造函数参数上添加@ConfigProperty注解,直接注入配置值 public ConfigWebScraperBuilder(@ConfigProperty(name = "bot.webscraper.className") String webScraperClassName) { this.webScraperClassName = webScraperClassName; } public WebScraper buildWebScraperFromConfig() throws Exception { Class<?> clazz = Class.forName(webScraperClassName); Constructor<?> constructor = clazz.getConstructor(ParserAdapter.class); return (WebScraper) constructor.newInstance(new ParserAdapter()); } }
补充说明
其他位置的@ConfigProperty注入正常,是因为对应类要么使用无参构造函数,要么构造函数参数已正确配置注入注解,CDI容器能正常解析依赖。
内容的提问来源于stack exchange,提问作者Furious Gamer
相关产品推荐
相关产品推荐

