我知道現在可能有點晚了,但今天我剛遇到這個問題,想著也許在這裡分享一下會更好。
由於MongoTemplate(及其默認轉換器)是在我們的自定義轉換器之後初始化的,因此無法直接將它們注入到我們的轉換器中,但是我們可以通過實現ApplicationContextAware
來訪問它們。
在訪問mongoTemplate之後,我們可以通過調用mongoTemplate.getConverter().read
和mongoTemplate.getConverter().write
方法分別委派讀寫轉換。
讓我們舉個例子。 假設我們有兩個POJO:
public class Outer {
public String var1;
public int var2;
public Inner inner;
}
public class Inner {
public String var3;
public String var4;
}
WriteConverter 可以是这样的:
import org.bson.Document;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;
@Component
public class CustomWriteConverter implements Converter<Outer, Document>, ApplicationContextAware {
private ApplicationContext applicationContext;
private MongoTemplate mongoTemplate;
@Override
public Document convert(Outer source) {
if (mongoTemplate == null) {
this. mongoTemplate = applicationContext.getBean(MongoTemplate.class);
}
Document document = new Document();
document.put("var1", source.var1);
document.put("var2", source.var2);
Document inner = new Document();
mongoTemplate.getConverter().write(source.inner, inner);
document.put("inner", inner);
return document;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
而且还有ReadConverter:
import org.bson.Document;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;
@Component
public class CustomReadConverter implements Converter<Document, Outer>, ApplicationContextAware {
private ApplicationContext applicationContext;
private MongoTemplate mongoTemplate;
@Override
public Outer convert(Document source) {
if (mongoTemplate == null) {
this. mongoTemplate = applicationContext.getBean(MongoTemplate.class);
}
Outer outer = new Outer();
outer.var1 = source.getString("var1");
outer.var2 = source.getInteger("var2");
Inner inner = mongoTemplate.getConverter().read(Inner.class, (Document) source.get("inner"));
outer.inner = inner;
return outer;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
mongoTemplate 可以被多个线程初始化(因为它处于竞争状态),但由于它是单例范围,所以不会有问题。
现在唯一要做的就是注册我们的转换器。