当前位置: 首页 > 知识库问答 >
问题:

Springboot与Redis Sentinals得到不满意DependencyException

仇征
2023-03-14

我无法使用Spring Boot连接Redis Sentinal节点。我在创建bean cacheManager和localCacheManager时收到UnsatisfiedDependencyException。我没有做错事。谁能帮我一下吗。

使用Spring boot版本- 2.6。Maven依赖项是-

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>2.6.6</version>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>4.2.2</version>
    <optional>true</optional>
</dependency>

代码-

@EnableAutoConfiguration
@Configuration
@EnableCaching
public class RedisCacheConfig {
    
    private final Logger logger = LoggerFactory.getLogger(RedisCacheConfig.class);

    @Value("${spring.profiles.active}")
    private String profiles;
    
    @Value("${redis.sentinel.nodes}")
    private String sentinelNodes;

    @Value("${redis.sentinel.password}")
    private String redisPassword;

    @Value("${redis.sentinel.master.name}")
    private String redisMasterName;
    
    @Value("${redis.sentinel.master.node}")
    private String redisMasterNode;

    @Value("${redis.sentinel.port}")
    private Integer redisSentinelPort;
    
    @Value("${redis.port}")
    private Integer redisPort;

    @Value("${pool.max.wait.seconds}")
    public int secondsToWait;

    @Value("${pool.max.total}")
    public int maxTotal;

    @Value("${pool.max.idle}")
    public int maxIdle;

    @Value("${pool.min.idle}")
    public int minIdle;
    
    public String cacheNames;

    @Bean
    public CacheManager cacheManager(RedisTemplate<String, String> redisTemplate) {    
       if(!StringUtils.hasLength(profiles)) {
           if(profiles.toLowerCase().contains("dev")) {
               cacheNames = ":DEV:";
           } else if(profiles.toLowerCase().contains("qa")) {
               cacheNames = ":PROD:";
           } 
       }
      
       RedisCacheManager.builder(connectionFactory())
       .cacheDefaults(RedisCacheConfiguration
       .defaultCacheConfig().prefixCacheNameWith(cacheNames)).build();
       
            return cacheManager(redisTemplate);
    }
  
    @Bean
    public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }

    @Bean
    public JedisConnectionFactory connectionFactory() {
        JedisConnectionFactory factory = null;
        try {
            long seconds=secondsToWait * 1000L;

            JedisPoolConfig poolConfig = new JedisPoolConfig();

            poolConfig.setMaxTotal(maxTotal);

            poolConfig.setMaxIdle(maxIdle);

            poolConfig.setMinIdle(minIdle);

            poolConfig.setTestOnBorrow(true);

            poolConfig.setTestOnReturn(true);

            poolConfig.setTestWhileIdle(true);

            poolConfig.setMaxWaitMillis(seconds);
            
            factory = new JedisConnectionFactory(sentinelConfig(), poolConfig);
            
            factory.setUsePool(true);
    
            factory.setPassword(redisPassword);
         
            factory.setPort(redisPort);
            
            factory.afterPropertiesSet();

      } catch(Exception e) {
            e.printStackTrace();
        }
        return factory;
    }
    
    
    @Bean
    public RedisSentinelConfiguration sentinelConfig() {
        
         
        String[] nodes = StringUtils.commaDelimitedListToStringArray(sentinelNodes);
        logger.info("===================== Connecting to Redis 3 =====================");
        logger.info(Arrays.toString(nodes));
        
        final RedisSentinelConfiguration SENTINEL_CONFIG = new RedisSentinelConfiguration().master(redisMasterName).sentinel(redisMasterNode, redisSentinelPort);
        
        SENTINEL_CONFIG.setPassword(redisPassword);
        
        for (String node : nodes) {
            SENTINEL_CONFIG.sentinel(node, redisSentinelPort);
        }
        return SENTINEL_CONFIG;
    }
}

代码 (重制模板) -

@Bean
public RedisTemplate<Object, Object> redisTemplate(JedisConnectionFactory cf) {
    RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<Object, Object>();
    redisTemplate.setConnectionFactory(cf);
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    redisTemplate.setDefaultSerializer(new GenericJackson2JsonRedisSerializer());
    redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
    redisTemplate.setHashKeySerializer(new StringRedisSerializer());
    redisTemplate.setKeySerializer(new GenericToStringSerializer<Long>(Long.class));
    return redisTemplate;
}

下面是我得到的错误代码-

取消刷新尝试:创建名为'localCacheManager'的bean:通过字段'redisCacheManager'表示的不满足依赖项;

嵌套异常 在类路径资源中定义了名称“缓存管理器”的 Bean 时出错 [com/RedisCacheConfig.class]:

嵌套异常 在类路径资源中定义名称为“字符串RedisTemplate”的 Bean 时出错 [组织/Spring框架/引导/自动配置/数据/redis/RedisAuto 配置.class]:通过方法“字符串RedisTemplate”参数 0 表示的未满足的依赖关系;

嵌套异常为org . spring framework . beans . factory . beancreationexception:创建在类路径资源[com/ABC/mbile/XYZ/rediscacheconfig . class]中定义的名为“connectionFactory”的bean时出错:通过工厂方法进行的Bean实例化失败;

嵌套异常是org.springframework.beans。BeaInstantiationException:未能实例化[org.springframework.data.redis.connection.jedis.jedis.JedisConnectionFactory]:工厂方法“connectionFactory”引发异常

嵌套异常是Java . lang . noclassdeffounderror:redis/clients/jedis/geo unit

共有1个答案

袁鸿雪
2023-03-14

您正在尝试将Jedis 4.x与Spring boot 2.x配合使用。将Jedis4.x与Springboot 2.x配合使用可能会很困难。

有一些用户正在使用Jedis 4,但如果您没有使用某些特定功能并且愿意完成一些额外的工作,这是可能的。

在Spring发布对Jedis 4的支持之前,你可能会考虑坚持使用Jedis 3.x。

 类似资料:
  • 问题内容: 我有一些漂亮的标准代码,它从流中获取序列化的对象,基本上看起来像这样: 然后,我的资源文件夹中有一个文件,因此在开发机器上,我可以将其引用为文件或JarResource: 在我的脑海中,两个都应该做完全相同的事情。但是,碰巧两种情况都解析为有效(非空)流,但是FileInputStream正确地从我的getObjectFromStream(InputStream)方法返回了一个Obje

  • 问题内容: 我想创建一个简单的JNI层。我使用Visual Studio 2008创建了一个dll(带有DLL作为选项的Win 32 Console Application项目类型)。我在调用本地方法时收到此异常: 生成的头文件是: 实现文件是: Java文件是: 当我调用本地方法“ Hello”时,我得到执行。 我观察到的另一件事是,当我使用以下命令在命令行中进行编译时:“ cl -I” C:\

  • 我刚从下载了Tess4Jhttp://tess4j.sourceforge.net/并将其导入到netbeans中。我遵循这个url,我正确地遵循了每一步,但当我尝试执行时,我得到了下面的错误。 错误: 我搜索并发现人们建议更新到 Visual Visual Studio 2013 的可再发行组件包,我做了,但事实证明没有帮助,我仍然遇到同样的问题。我不知道我做错了什么,下面是我的代码。 代码:

  • 我在stackoverflow上四处寻找类似的问题,但我找到的解决方案似乎都不适合我。我在一台Linux /Ubuntu机器上。我只是在练习JNI,但我发现了这个错误: 我提供了我的 .c、.h 和 .java文件。 .java文件: .c文件: .h 文件: 我使用这些命令生成. h文件,编译/生成. so文件,然后运行: JAVACnativetest.java javah-jni nativ

  • 我用vscode写了一个java程序。但是我在java输出中得到了意想不到的答案。通常这个sout应该是6.6,但是java说6.6000000000000005。为什么