我想转换Optional<BigDecimal>
为morphia。我创建了 BigDecimalConverter,它工作正常。现在我想创建 OptionalConverter。
Optional 可以容纳任何对象类型。在我的OptionalConverter.encode
方法中,我可以提取底层对象,并且我想将它传递给默认的 mongo 转换。所以如果有字符串,我只会得到字符串,如果有我的实体之一,我会得到编码的实体。我该怎么做?
有两个问题:
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 的准确类型信息。
对于非常简单的情况,例如,如果您不需要处理所有可能的参数类型,并且在阅读时没有歧义,那么它可能是可能的。