Quarkus配置RedisHostsProvider后运行时找不到对应实现类如何解决?
问题根因
Quarkus是通过CDI容器查找对应名称的RedisHostsProvider实现类,你自定义的实现类没有被CDI托管,也没有指定对应的Bean名称,因此运行时无法找到匹配的实例。
解决步骤
- 给
QuoteRedisHostsProvider类添加CDI作用域注解和@Named名称注解,修改后代码如下:
package gas.redis; import io.quarkus.redis.client.RedisHostsProvider; // Quarkus 3+ 使用jakarta包,低版本请替换为javax包 import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Named; import java.net.URI; import java.net.URISyntaxException; import java.util.Set; @ApplicationScoped // 注解内的名称必须和application.properties中配置的hosts-provider-name完全一致 @Named("gas.redis.QuoteRedisHostsProvider") public class QuoteRedisHostsProvider implements RedisHostsProvider { @Override public Set<URI> getHosts() { System.out.println("In QuoteRedisHostsProvider"); String redis_url = System.getenv("REDIS_URL"); URI redisURI = null; try { redisURI = new URI(redis_url); } catch(Exception e) { e.printStackTrace(); try { redisURI = new URI("redis://localhost:6379"); } catch (URISyntaxException ignored) { } } return Set.of(redisURI); } }
- 若你的项目启动类不在
gas包及其子包下,需要在application.properties中添加配置放开包扫描:
quarkus.arc.include-packages=gas.redis
可选优化
你可以将@Named的值修改为更简洁的短名称,例如@Named("quoteRedisProvider"),同步修改application.properties配置为quarkus.redis.hosts-provider-name=quoteRedisProvider即可。
内容的提问来源于stack exchange,提问作者Gas
相关产品推荐
相关产品推荐

