Spring Boot中Redis键值对创建/更新日期字段为null问题
解决Spring Data Redis中@CreatedDate和@LastModifiedDate字段为null的问题
你遇到的问题是因为Spring Data Redis默认不会自动处理审计字段的填充,需要手动开启审计功能并配置相关组件,具体步骤如下:
1. 开启Redis审计功能
在你的Spring Boot启动类或者配置类上添加@EnableRedisAuditing注解,这会让Spring注册对应的审计监听器,负责在实体保存/更新时填充时间戳:
@SpringBootApplication @EnableRedisAuditing public class CartApplication { public static void main(String[] args) { SpringApplication.run(CartApplication.class, args); } }
2. 确保实体类字段可写
你的Cart类已经添加了@Setter注解,这没问题——审计机制需要通过setter方法来设置时间字段值,所以要确保createdAt和modifiedAt有对应的setter方法。
3. (可选)自定义时间生成逻辑
如果需要自定义时间的生成方式(比如指定时区、使用LocalDateTime替代Date),可以配置DateTimeProvider Bean:
@Configuration public class RedisAuditConfig { @Bean public DateTimeProvider dateTimeProvider() { // 这里可以根据需求返回自定义时间,比如带时区的LocalDateTime return () -> Optional.of(LocalDateTime.now(ZoneId.of("Asia/Shanghai"))); } }
如果还是想用Date类型,直接返回new Date()即可:
return () -> Optional.of(new Date());
4. 通过Spring Data Repository执行操作
必须使用Spring Data提供的Repository接口(比如CrudRepository<Cart, UUID>)来执行保存、更新操作,直接使用RedisTemplate操作不会触发审计字段的自动填充。示例Repository:
public interface CartRepository extends CrudRepository<Cart, UUID> { }
关键说明
Spring Data Redis的审计机制和JPA不同,JPA默认会处理审计字段,但Redis需要显式开启@EnableRedisAuditing才能激活时间戳的自动填充逻辑。开启后,当你调用repository.save(cart)时:
- 第一次保存(新增):
createdAt和modifiedAt都会被设置为当前时间 - 后续更新:只有
modifiedAt会被更新为当前时间
内容的提问来源于stack exchange,提问作者thenocturnalguy
相关产品推荐
相关产品推荐

