Spring Boot Redis CRUD Repository调用findById/findAll返回Optional.empty求助
问题根因
你自定义的RedisTemplate未配置明确的序列化规则,默认使用JdkSerializationRedisSerializer进行序列化/反序列化,反序列化时只要类信息、序列化ID等存在微小差异就会静默失败返回空,不会抛出异常,最终导致Repository的查询方法返回空结果。同时你当前的实体类缺少反序列化必需的无参构造函数,也会导致反序列化失败。
可行解决方案
步骤1:补充实体类无参构造
反序列化框架需要调用无参构造创建对象,你当前只添加了@AllArgsConstructor会覆盖默认无参构造,需要补充@NoArgsConstructor注解:
@Data @NoArgsConstructor // 新增 @AllArgsConstructor @RedisHash("OTPValidationLogCache") @TypeAlias("OTPValidationLogCache") // 可选新增,明确类型别名避免反序列化类型匹配失败 public class OTPValidationLogCache { // 原有属性保持不变 @Id @Indexed private String id; @Indexed private int validationFailureCount; @TimeToLive(unit = TimeUnit.MILLISECONDS) private long expiry; }
步骤2:修正RedisTemplate序列化配置
修改RedisConfig中的redisTemplate Bean配置,明确指定key、value、hash结构的序列化器,推荐使用Jackson序列化器提升兼容性:
@Bean public RedisTemplate<String, Object> redisTemplate() { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory()); // 使用String序列化器序列化key StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); template.setKeySerializer(stringRedisSerializer); template.setHashKeySerializer(stringRedisSerializer); // 使用Jackson序列化器序列化value GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(); template.setValueSerializer(jackson2JsonRedisSerializer); template.setHashValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; }
步骤3:(可选)检查依赖
如果项目没有引入Jackson相关依赖,需要在pom.xml中添加:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-json</artifactId> </dependency>
修改完成后清空Redis中已存储的旧数据,重新写入后即可正常查询。
内容的提问来源于stack exchange,提问作者Hitesh Kirtane
相关产品推荐
相关产品推荐

