关于redisTemplate注入的泛型类型不匹配报错

在SpringBoot中注入redisTemplate,

private RedisTemplate<String, Object> redisTemplate; 

启动报错:

这是因为 Spring 的依赖注入机制和泛型类型擦除的问题:

  1. Java 的泛型在运行时会被擦除
    • RedisTemplate<String, Object> 在运行时实际上就是 RedisTemplate
    • Spring 在注入时需要知道具体的泛型类型
  2. 默认的 RedisTemplate:
    • Spring Boot 自动配置会创建一个默认的 RedisTemplate<Object, Object>
    • 这个默认的 RedisTemplate 的泛型类型是 <Object, Object>
    • 而当前注入需要的是 RedisTemplate<String, Object>
  3. 类型不匹配
1 1    // RateLimitAspect 中需要的类型
2 2    private final RedisTemplate<String, Object> redisTemplate;
3 3    
4 4    // Spring Boot 默认提供的类型
5 5    RedisTemplate<Object, Object>

处理方法:

    通过 @Bean 方法显式创建一个 RedisTemplate<String, Object>,这样 Spring 就能找到完全匹配的类型,也可以同时自定义序列化器等配置

 1  1 @Configuration
 2  2 public class RedisConfig {
 3  3 
 4  4     @Bean
 5  5     public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
 6  6         RedisTemplate<String, Object> template = new RedisTemplate<>();
 7  7         template.setConnectionFactory(connectionFactory);
 8  8 
 9  9         template.setKeySerializer(new StringRedisSerializer());
10 10         template.setHashKeySerializer(new StringRedisSerializer());
11 11 
12 12         GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
13 13         template.setValueSerializer(jsonRedisSerializer);
14 14         template.setHashValueSerializer(jsonRedisSerializer);
15 15 
16 16         template.afterPropertiesSet();
17 17         return template;
18 18     }

 

posted @ 2025-06-12 11:30  Marktowin  阅读(54)  评论(0)    收藏  举报