未找到工厂 Bean "自定义转换"



我试图将我的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
    }
}

删除那条记录后一切都好了。

最新更新