Spring Mongo转换器注册后无法转换LocalDate至Date问题求助
解决MongoDB LocalDate转Date的转换器缺失问题
你遇到的ConverterNotFoundException提示很明确:
org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.time.LocalDate] to type [java.util.Date]
咱们来一步步排查并解决这个问题:
首先分析核心原因:
Jsr310Converters没有直接提供LocalDate→Date的转换器:Spring Data MongoDB自带的Jsr310Converters覆盖了大部分Java 8时间类型转换,但确实漏掉了LocalDate到java.util.Date的直接实现,这也是你调用canConvert(LocalDate.class, Date.class)返回false的直接原因。- 禁用了默认存储转换逻辑:你使用
CustomConversions.StoreConversions.NONE初始化自定义转换,这会关闭框架默认的存储相关转换器,阻断了可能存在的隐式转换路径。
接下来给你两种可行的解决方案:
方案一:手动添加自定义转换器
直接在转换器列表里加入LocalDate到Date的转换实现:
@Configuration public class MongoConfig { @Autowired MongoDbFactory mongoDbFactory; @Bean public MongoTemplate mongoTemplate() throws Exception { MappingMongoConverter converter = new MappingMongoConverter(new DefaultDbRefResolver(mongoDbFactory), new MongoMappingContext()); converter.setMapKeyDotReplacement("_"); List<Converter<?, ?>> converters = new ArrayList<Converter<?, ?>>(); // 新增LocalDate转Date的转换器 converters.add(new Converter<LocalDate, Date>() { @Override public Date convert(LocalDate source) { // 这里可以根据你的需求调整时区,比如用UTC return source == null ? null : Date.from(source.atStartOfDay(ZoneId.systemDefault()).toInstant()); } }); converters.add(new GeoPointConverter()); converters.addAll(Jsr310Converters.getConvertersToRegister()); converters.addAll(JodaTimeConverters.getConvertersToRegister()); converters.addAll(ThreeTenBackPortConverters.getConvertersToRegister()); converter.setCustomConversions(new CustomConversions(CustomConversions.StoreConversions.NONE, converters)); // 现在这个判断应该返回true了 boolean canConvertFromLocalDateToDate = converter.getConversionService().canConvert(LocalDate.class, Date.class); MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory, converter); return mongoTemplate; } }
方案二:启用默认存储转换器(更推荐)
如果你没有必须禁用默认转换器的理由,建议改用CustomConversions的默认构造方法,这样框架会自动加载必要的转换逻辑,同时保留你的自定义转换器:
// 替换原来的CustomConversions初始化代码 converter.setCustomConversions(new CustomConversions(converters));
这种方式不仅能解决当前的转换问题,还能避免后续遇到其他类似的转换器缺失情况,因为框架会维护默认的转换规则。
最后补充个小提示:如果你的项目是基于Spring Boot 2.x及以上版本,其实不需要手动注册Jsr310Converters、JodaTimeConverters这些,框架会自动完成配置,你只需要添加自己的GeoPointConverter即可,这样配置会更简洁。
内容的提问来源于stack exchange,提问作者ElArbi
相关产品推荐
相关产品推荐

