使用自定义转换器时发现了一个问题。
让我说对象是:
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
所以,看起来我不能回退到使用自定义转换器转换的对象属性的默认转换?!
任何有用的解决方案,而不是手动进行所有转换?
答案 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;
}
}