找不到工厂bean'customConversions'

时间:2013-02-27 15:18:53

标签: spring spring-data-mongodb

我正在尝试将我的MongoDB库更新到最新版本,现在有一些错误,可能会也可能不会相关。第一个是在我的applicationContext.xml中,我在本节旁边有错误的“Factory 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.RELEASE org.springframework:core,spring-context等:3.2.1.RELEASE

这只是一个破损的版本,还是我做错了什么?我之前在我的模型类中使用java.util.Date没有问题。

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

好的,这是一段时间之后,但它可能有益于人们从遗留的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,由于这个问题,我们之前无法对该项目进行处理。 / p>

答案 2 :(得分:0)

我有相同的映射异常(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
    }
}

删除该记录后,一切正常。