mongoTemplate:具有非标准对象的自定义转换器

时间:2013-05-27 11:52:14

标签: spring mongodb

使用自定义转换器时发现了一个问题。

让我说对象是:

public class Foo {
    private String id;
    private Bar bar;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public Bar getBar() {
        return bar;
    }

    public void setBar(Bar bar) {
        this.bar = bar;
    }
}

public class Bar {
    private String id;
    private String property;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getProperty() {
        return property;
    }

    public void setProperty(String property) {
        this.property = property;
    }
}

如果将它们插入MongoDB,只要不涉及自定义转换器,一切正常。

    Bar bar = new Bar();
    bar.setProperty("Test");
    Foo foo = new Foo();
    foo.setBar(bar);

    mongoTemplate.insert(bar);
    mongoTemplate.insert(foo);

结果:

{
    "_id" : {
        "$oid" : "51a346059f2c9d656019798e"
    },
    "_class" : "Bar",
    "property" : "Test"
}
{
    "_id" : {
        "$oid" : "51a346059f2c9d656019798f"
    },
    "_class" : "Foo",
    "bar" : {
        "_id" : {
            "$oid" : "51a346059f2c9d656019798e"
        },
        "property" : "Test"
    }
}

现在我写了一个自定义转换器,因为Foo需要以特殊方式存储。

public class FooWriteConverter implements Converter<Foo, DBObject> {

    @Override
    public DBObject convert(Foo source) {
        DBObject dbo = new BasicDBObject();
        dbo.put("id", source.getId());
        dbo.put("bar", source.getBar());
        return dbo;
    }

}

现在我收到了这个错误。

Caused by: java.lang.IllegalArgumentException: can't serialize class Bar

所以,看起来我不能回退到使用自定义转换器转换的对象属性的默认转换?!

任何有用的解决方案,而不是手动进行所有转换?

1 个答案:

答案 0 :(得分:1)

要在自定义转换器中使用属性的默认转换,您需要一个MongoConverter类帮助。

public class FooWriteConverter implements Converter<Foo, DBObject> {
    private MongoConverter mongoConverter;

    public FooWriteConverter(MongoConverter mongoConverter) {
        this.mongoConverter = mongoConverter;
    }

    @Override
    public DBObject convert(Foo source) {
        DBObject dbo = new BasicDBObject();
        dbo.put("id", source.getId());

        DBObject bar = new BasicDBObject();
        mongoConverter.write(source.getBar(), bar);
        dbo.put("bar", bar);
        return dbo;
    }
}