[英]Java Spring how to persist a date field in MongoDb as long
我正在处理的项目有一个集合,其中一个字段是一个长整数,代表一个日期。 代表 Java class model 有一个日期字段作为长字段的对应。
我们使用Json 架构来创建集合并设置数据格式和必填字段。
db 上的数据已使用 json 文件导入,可以通过我们的 Java 应用程序毫无问题地读取:驱动程序能够将长信息转换为Date ,而 model class 上没有注释或其他内容。
当我们需要从 java 应用程序保存同一个文档时,问题就出现了。 似乎驱动程序无法从 Date 到 long 进行反向转换。
你有什么建议吗?
我将 Date 更改为 Instant 并且它没有解决保存问题,但在阅读时它给出了以下异常:
“org.springframework.core.convert.ConverterNotFoundException:找不到能够从类型 [java.lang.Long] 转换为类型 [java.time.Instant] 的转换器”
为了解决这个问题,我需要创建一个转换器:
public class FromLongToInstantConverter implements Converter<Long, Instant> {
@Override
public Instant convert(Long source) {
return Instant.ofEpochMilli(source);
}
}
这个转换器需要由 Mongo 驱动程序加载,所以我必须创建这个 class:
public abstract class AbstractMongoConfiguration extends AbstractMongoClientConfiguration {
@Bean
@Override
public MongoCustomConversions customConversions() {
List<Converter<?, ?>> converters = new ArrayList<>();
converters.add(new FromLongToInstantConverter());
return new MongoCustomConversions(converters);
}
/**
*
* @return
*/
@Bean
@Override
public MongoTemplate mongoTemplate() {
MappingMongoConverter converter = new MappingMongoConverter(
new DefaultDbRefResolver(mongoDbFactory()), new MongoMappingContext());
converter.setCustomConversions(customConversions());
converter.afterPropertiesSet();
return new MongoTemplate(mongoDbFactory(), converter);
}
}
它将由应用程序中的 MongoConfig.java 扩展。
然而,此解决方案会导致此错误: Spring Boot - Illegal reflective access by org.springframework.cglib.core.ReflectUtils$1
我为保存操作做了一个类似的转换器,并将其添加到上面的AbstractMongoConfiguration中:
public class FromInstantToLongConverter implements Converter<Instant, Long> {
@Override
public Long convert(Instant source) {
return source.toEpochMilli();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.