Spring Boot 2中Mongo审计字段ZonedDateTime无法正常工作
解决Spring Boot 2.x中Mongo审计字段无法使用自定义ZonedDateTime转换器的问题
我之前在升级Spring Boot到2.x版本时也碰到过一模一样的问题!根源在于Spring Boot 2.0对Mongo审计模块的实现做了重构,导致审计字段(比如@CreatedDate、@LastModifiedDate标注的字段)的日期处理逻辑不再走全局的自定义转换器链,而是用了独立的日期生成和转换逻辑,所以你的ZonedDateTime转换器对普通字段生效,但对审计字段失效。
下面给你两种可行的解决方案:
方法一:自定义DateTimeProvider直接生成ZonedDateTime
这种方法最直接,不需要依赖转换器,让审计模块直接生成你需要的ZonedDateTime类型日期:
- 实现
DateTimeProvider接口,返回指定时区的ZonedDateTime:
@Component("zonedDateTimeProvider") public class ZonedDateTimeProvider implements DateTimeProvider { // 这里可以换成你业务需要的时区,比如ZoneId.systemDefault() private static final ZoneId DEFAULT_ZONE = ZoneId.of("UTC"); @Override public Optional<TemporalAccessor> getNow() { return Optional.of(ZonedDateTime.now(DEFAULT_ZONE)); } }
- 在启用Mongo审计时指定这个自定义的日期提供器:
@Configuration @EnableMongoAuditing(dateTimeProviderRef = "zonedDateTimeProvider") public class MongoAuditingConfiguration { }
这样配置后,@CreatedDate和@LastModifiedDate标注的ZonedDateTime字段会直接被赋值为你定义的日期,完全绕开转换环节,自然不会有问题。
方法二:让审计模块使用自定义转换器
如果你必须保留转换器逻辑,可以通过配置MongoAuditingBeanPostProcessor,让审计模块复用你的自定义MongoConverter:
@Configuration public class MongoAuditingConverterConfig { @Autowired private MongoConverter mongoConverter; @Bean public MongoAuditingBeanPostProcessor mongoAuditingBeanPostProcessor() { MongoAuditingBeanPostProcessor auditingProcessor = new MongoAuditingBeanPostProcessor(); // 将包含自定义ZonedDateTime转换器的MongoConverter设置给审计处理器 auditingProcessor.setConverter(mongoConverter); return auditingProcessor; } }
这个配置会让审计字段的读写都经过你配置的自定义转换器,和普通字段保持一致的处理逻辑。
验证方案
不管用哪种方法,都可以测试一下:
- 保存一个带审计字段的实体到MongoDB
- 查看数据库中日期的存储格式是否符合你的预期
- 从数据库读取实体,确认ZonedDateTime字段能正常还原
内容的提问来源于stack exchange,提问作者Vlad
相关产品推荐
相关产品推荐

