Spring JPA查询MongoDB时如何将ISODate转为时间戳
解决方案
方案1:自定义MongoDB类型转换器(推荐)
通过实现Spring Data MongoDB的转换器,让MongoDB的Date类型在映射到JsonNode时自动转为时间戳(Long类型):
- 定义读取转换器,将
Date转为Long:
import org.springframework.core.convert.converter.Converter; import org.springframework.data.convert.ReadingConverter; import java.util.Date; @ReadingConverter public class DateToLongConverter implements Converter<Date, Long> { @Override public Long convert(Date source) { return source != null ? source.getTime() : null; } }
- 注册转换器到MongoDB配置类:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.mongodb.core.convert.MongoCustomConversions; import java.util.List; @Configuration public class MongoConfig { @Bean public MongoCustomConversions mongoCustomConversions() { return new MongoCustomConversions(List.of(new DateToLongConverter())); } }
配置完成后,MongoTemplate将Document映射到Dto的JsonNode时,所有Date类型字段会自动转为时间戳,无需手动遍历处理。
方案2:定制Jackson的ObjectMapper
通过定制Jackson的ObjectMapper,直接控制JsonNode的日期序列化行为:
- 配置自定义ObjectMapper:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.TimeZone; @Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); // 开启日期序列化为时间戳,关闭ISO格式输出 mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true); mapper.setTimeZone(TimeZone.getDefault()); return mapper; } }
- 让Spring Data MongoDB使用该ObjectMapper处理映射:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.mongodb.core.convert.MappingMongoConverter; import org.springframework.data.mongodb.core.mapping.MongoMappingContext; @Configuration public class MongoConfig { private final ObjectMapper objectMapper; public MongoConfig(ObjectMapper objectMapper) { this.objectMapper = objectMapper; } @Bean public MappingMongoConverter mappingMongoConverter(MongoMappingContext context) { MappingMongoConverter converter = new MappingMongoConverter(context); converter.setObjectMapper(objectMapper); return converter; } }
该方案通过Jackson全局配置,让所有Date类型在序列化为JsonNode时输出时间戳,同样能避免手动遍历Document的冗余操作。
补充说明
你之前手动遍历Document转换日期的方法虽可行,但冗余且易遗漏嵌套结构。上述两种方案依托Spring Data的自动映射机制实现转换,更符合框架设计理念,也更易维护。
内容的提问来源于stack exchange,提问作者rwachter
相关产品推荐
相关产品推荐

