我正在尝试对现有MongoDB数据库中的文档实施乐观锁定。当前没有version
字段,我想避免添加它,因为我们必须停止应用程序。
但是有一个lastModified
日期字段,看来我可以这样使用它:
@LastModifiedDate
@Version
private Date lastModified;
但是当我将此字段标记为@Version
并尝试保存项目时,出现以下异常:
未找到能够将[java.lang.Date]类型转换为[java.lang.Number]类型的转换器
因此,我还向配置中添加了Date to Number和Long to Date转换器:
@Configuration
public class MongoConfig extends AbstractMongoConfiguration {
...
@Override
public CustomConversions customConversions() {
return new CustomConversions(CustomConversions.StoreConversions.NONE,
Arrays.asList(
new DateToNumberConverter(),
new LongToDateConverter()
));
}
}
这就像现有文档的魅力一样。但是,当我尝试添加新文档时,我得到:
未找到能够将[java.lang.Integer]类型转换为[java.util.Date]类型的转换器
如果我随后将Integer to Date转换器添加,则新文档将保存在数据库中,但是所有日期现在都是NumberLong
而不是ISODate
,即"lastModified" : ISODate("2018-10-02T07:30:12.005Z")
和现在"lastModified" : NumberLong("1538465479364")
。这破坏了现有文档与新文档之间的一致性。
所以问题是:
java.util.Date
与@Version
一起使用,以便所有日期都以ISODate
的形式存储在MongoDB中?答案 0 :(得分:0)
似乎当前无法将Date用作版本字段,因为它将日期强制转换为MongoTemplate中的Number。 我通过使用自定义MongoTemplate解决了该问题,该自定义MongoTemplate扩展了Spring Data MongoTemplate并覆盖了必需的方法。不幸的是,由于重写逻辑在私有方法中,因此我不得不复制粘贴很多代码。