1

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

假设我的对象是:

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

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

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

4

1 回答 1

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;
    }
}
于 2013-05-27T15:00:46.187 回答