RedisTemplate注入泛型类型不匹配,如何解决这个难题?
摘要:在SpringBoot中注入redisTemplate, private RedisTemplate<String, Object> redisTemplate; 启动报错: 这是因为 Sprin
在SpringBoot中注入redisTemplate,
private RedisTemplate<String, Object> redisTemplate;
启动报错:
这是因为 Spring 的依赖注入机制和泛型类型擦除的问题:
Java 的泛型在运行时会被擦除
RedisTemplate<String, Object> 在运行时实际上就是 RedisTemplate
Spring 在注入时需要知道具体的泛型类型
默认的 RedisTemplate:
Spring Boot 自动配置会创建一个默认的 RedisTemplate<Object, Object>
这个默认的 RedisTemplate 的泛型类型是 <Object, Object>
而当前注入需要的是 RedisTemplate<String, Object>
类型不匹配
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 }
