我想在morphia中转换Optional<BigDecimal>
。我创建了BigDecimalConverter,它工作正常。现在我想创建OptionalConverter。
可选可以保存任何对象类型。在我的OptionalConverter.encode
方法中,我可以提取底层对象,我想将其传递给默认的mongo转换。所以,如果有字符串,我只会得到字符串,如果有我的一个实体,我将得到编码实体。我该怎么办?
答案 0 :(得分:-1)
有两个问题:
1.如何拨打其他转换器?
2.如何为类型参数不是静态知道的泛型类创建转换器?
第一个可以通过一起创建MappingMongoConveter和自定义转换器来实现:
@Configuration
public class CustomConfig extends AbstractMongoConfiguration {
@Override
protected String getDatabaseName() {
// ...
}
@Override
@Bean
public Mongo mongo() throws Exception {
// ...
}
@Override
@Bean
public MappingMongoConverter mappingMongoConverter() throws Exception {
MappingMongoConverter mmc = new MappingMongoConverter(
mongoDbFactory(), mongoMappingContext());
mmc.setCustomConversions(new CustomConversions(CustomConverters
.create(mmc)));
return mmc;
}
}
public class FooConverter implements Converter<Foo, DBObject> {
private MappingMongoConverter mmc;
public FooConverter(MappingMongoConverter mmc) {
this.mmc = mmc;
}
public DBObject convert(Foo foo) {
// ...
}
}
public class CustomConverters {
public static List<?> create(MappingMongoConverter mmc) {
List<?> list = new ArrayList<>();
list.add(new FooConverter(mmc));
return list;
}
}
由于类型擦除,第二个更加困难。我试图为Scala的Map创建一个转换器,但还没找到方法。在写入时无法获取源Map的确切类型信息,或在读取时无法获取目标Map。
对于非常简单的情况,例如如果你不需要处理所有可能的参数类型,并且在阅读时没有歧义,那么它可能是可能的。