【问题标题】:Spring MongoDB Custom Converter not used when doing $set updates?进行 $set 更新时未使用 Spring MongoDB 自定义转换器?
【发布时间】:2012-01-09 04:00:02
【问题描述】:

简单示例之前的简短摘要:

  • 插入新文档是可以的,意思是它使用我的自定义转换器
  • 无法更新现有文档,这意味着它不使用我的自定义转换器

我的部门:

[INFO] +- org.springframework.data:spring-data-mongodb:jar:1.0.0.RC1:compile
[INFO] | +- org.springframework:spring-beans:jar:3.1.0.RELEASE:compile
[INFO] | +- org.springframework:spring-expression:jar:3.1.0.RELEASE:compile
[INFO] | +- org.springframework.data:spring-data-commons-core:jar:1.2.0.RC1:compile
[INFO] | | \- org.springframework:spring-tx:jar:3.1.0.RELEASE:compile
[INFO] | \- org.mongodb:mongo-java-driver:jar:2.7.1:compile

这是我的类有它自己的转换器

public class MyClass extends MyInterface<String> ..

这里是转换器:

public class MyClassWriteConverter implements Converter<MyClass, DBObject> {
    @Override
    public DBObject convert(MyClass myClass) {
        System.out.println("MyClass WRITE CONVERTER !");
        DBObject dbo = new BasicDBObject();
        dbo.put("title", myClass.getTitle());
        dbo.put("value", myClass.getValue());
        System.out.println("value : " + myClass.getValue());
        System.out.println("class : " + myClass.getClass().getCanonicalName());
        dbo.put("_class", myClass.getClass().getCanonicalName());
        return dbo;
    }
}
public class MyClassElementReadConverter implements Converter<DBObject, MyClass> {
    @Override
    public MyClass convert(DBObject dbObject) {
        String value = (String) dbObject.get("value");
        String title = (String) dbObject.get("title");
        return new MyClass(title, value);
    }
}

<mongo:converter>
    <bean class="kam.albert.MyClassElementReadConverter" />
</mongo:converter>
<mongo:converter>
    <bean class="kam.albert.MyClassElementWriteConverter" />
</mongo:converter>

myDomain 有一个List&lt;MyClass&lt;?&gt;&gt; myClasses, 这很好用,因为正在使用自定义转换器:

this.ops.save(myDomain, "myCollection");

从调试输出中可以看出:

MyClass ELEMENT WRITE CONVERTER !
value : my value
class : kam.albert.MyClass

并且有我的 db.myCollection.find().pretty(); 的结果:

{
    myClasses : [
        {
             "title" : "my title",
             "value" : "my value",
             "_class" : "kam.albert.MyClass"
        }
    ]
}

插入操作一切正常...

但是当我像这样对现有文档进行 $set 更新时:

this.ops.updateFirst(
    this.idCriteria(myClass),
    new Update()
        // set the content node
        .set(dotNotation, myClass),
        "myCollection"
);

调试输出保持不变:

MyClass ELEMENT WRITE CONVERTER !
value : my value
class : kam.albert.MyClass
(edited for clarity, the other properties omitted)
DEBUG [mongodb.core.MongoTemplate]: calling update using query: { "_id" : "81d3292e-fd75-410d-a1f9-b109b6d76194"} and update: { "$
set" : { "myClasses" : [ { "title" : "my title" , "value" : "my value"}]}] } in collection: myCollection

但是结果就像没有使用自定义转换器,没有“_class”属性:

{
    myClasses : [
        {
             "title" : "my title",
             "value" : "my value",
        }
    ]
}

我目前的结论是:

  • 对于插入新文档,自定义转换器可以正常工作
  • 虽然为了更新,虽然似乎调用了自定义转换器(调试输出在那里),但它似乎正在使用 默认 MappingMongoConverter 进行真正的更新。

我错过了什么吗?请分享您的想法..

【问题讨论】:

    标签: spring spring-data mongodb-java


    【解决方案1】:

    当前版本(截至撰写本文时为 1.0 GA)似乎没有将 Update 对象通过管道传输到负责将包含的潜在复杂对象按摩成 MongoDB 可以本机处理的对象的 QueryMapper 中。在这个过程中,MongoConverter 应该被调用,这应该反过来触发你的自定义转换器。

    该问题已在 the ticket you just filed 中捕获,并将在下一个错误修复版本(1.0.1、1.1.M1)中得到修复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-29
      相关资源
      最近更新 更多