我试图将我的MongoDB库更新到最新,现在有几个错误,这可能是或可能不是相关的。第一个是在我的applicationContext.xml,我有错误"工厂bean 'customConversions'未找到"旁边的这一部分:
<mongo:mapping-converter base-package="com.my.model">
<mongo:custom-converters base-package="com.my.model.converters">
</mongo:custom-converters>
</mongo:mapping-converter>
我无法从文档中看到我可能遗漏的任何东西。可能导致这种情况的原因是什么,我能做些什么来解决?
如果我尝试运行应用程序,我现在得到:
org.springframework.data.mapping.model.MappingException: No mapping metadata found for java.util.Date
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:206) ~[spring-data-mongodb-1.1.1.RELEASE.jar:na]
我使用以下Maven依赖项:
org.springframework。data: spring-data-mongodb: 1.1.1.RELEASEorg。springframework: core, spring-context等:3.2.1.RELEASE
这只是一个坏的版本,还是我做错了什么?我以前在我的模型类中使用java.util.Date没有问题。
添加到MongoTemplate了吗?http://static.springsource.org/spring-data/data-mongo/docs/1.0.0.M5/reference/html/d0e2718
好吧,这是一段时间后,但它可能有利于人们从旧的MongoDB版本升级代码和数据库。
我认为Mongo改变了一些数据的内部存储方式。或者我们将数据导出为JSON,然后再导入。无论哪种方式,我们得到的数据都有不正确的Date和不正确的ObjectId表示。Spring-data-mongo曾经处理过这个问题,但由于某种原因不再处理了。我们的解决方案是在Mongo shell中运行以下类型的脚本:
db.entity.find().forEach(
function(o){
delete o._id;
if (typeof(o.createdTs) !== 'undefined' && typeof(o.createdTs.sec) !== 'undefined'){
o.createdTs = ISODate(o.createdTs.sec);
}
if (typeof(o.updatedTs) !== 'undefined' && typeof(o.updatedTs.sec) !== 'undefined'){
o.updatedTs = ISODate(o.updatedTs.sec);
}
try{
db.entity2.insert( o );
} catch (err){
print("Following node conversion failed. Error is: " + err);
printjson(o);
}
}
);
db.entity2.renameCollection('entity', true);
现在这对我们来说是有效的,因为我们根本没有使用Mongo对象ID——我们一直在使用一个不同的、唯一索引的UUID字段作为ID。如果你在其他任何地方引用了objectId,你需要从旧的字符串id创建一个objectId并使用它。
这使我们能够升级到spring-data-1.1.0及更高版本,并且意味着我们现在可以引入spring-data-neo4j,之前由于这个问题我们无法在这个项目中做到这一点。
我有相同的映射异常(org.springframework.data.mapping.model.MappingException
)。MongoDB记录中的一个日期不知何故有以下格式的日期,无法通过java.util.date解码:
"createdTime": {
"dateTime": ISODate("2016-09-15T02:01:00.560Z"),
"offset": {
"_id": "Z",
"totalSeconds": 0
},
"zone": {
"_class": "java.time.ZoneOffset",
"_id": "Z",
"totalSeconds": 0
}
}
删除那条记录后一切都好了。