RedisTemplate注入失败典型表现为启动报UnsatisfiedDependencyException或IDE标红但运行“意外”成功,根本原因是泛型擦除导致编译期与运行期类型不一致;必须确保配置类Bean返回类型、字段注入类型及序列化器三者严格匹配,避免使用原始类型或混淆StringRedisTemplate与RedisTemplate。
启动报 UnsatisfiedDependencyException,提示找不到类型为 RedisTemplate 的 Bean;或者 IDE 显示注入变量标红,但运行时又“意外”成功——这往往是因为泛型擦除导致的编译期与运行期不一致。
RedisTemplate 是泛型类,Spring 容器按完整类型(包括泛型参数)匹配 Bean。你写 @Autowired RedisTemplate<string string> redisTemplate;</string>,容器就只找声明为 RedisTemplate<string string></string> 的 Bean,而不是 RedisTemplate<object object></object> 或未指定泛型的原始类型。
RedisTemplate Bean 但没显式指定泛型(比如用了 new RedisTemplate()),它默认是 RedisTemplate<object object></object>
RedisTemplate(无泛型),Java 会视为原始类型,Spring 不将其视为 RedisTemplate<string string></string> 的候选@RequiredArgsConstructor 或构造注入时,字段泛型必须和注入 Bean 的泛型完全一致,否则编译不报错但运行时报 NoUniqueBeanDefinitionException确保配置类中 Bean 的返回类型、注入点的字段类型、以及实际使用的 key/value 类型三者对齐:
@Configurationpublic class RedisConfig { @Bean public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, String> template = new RedisTemplate<>(); template.setConnectionFactory(factory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new StringRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(new StringRedisSerializer()); return template; }}
@Autowired private RedisTemplate<string string> redisTemplate;</string>
RedisTemplate(无泛型)或 RedisTemplate, ?> 在注入点都不可靠RedisTemplate<string object></string> Bean 并用 @Qualifier 区分,而不是复用同一个 BeanSpring Data Redis 3.x 起,StringRedisTemplate 默认继承自 RedisTemplate<string string></string>,但它是一个独立 Bean,不能替代泛型不匹配的 RedisTemplate 注入。
StringRedisTemplate “差不多能用”,它和 RedisTemplate<string string></string> 是不同类型的 BeanredisTemplate.opsForValue().set("k", "v") 前,确认 setValueSerializer 已设为 StringRedisSerializer,否则可能存入乱码字节