Morphia转换器调用其他转换器

时间:2013-05-20 13:53:39

标签: mongodb converter morphia

我想在morphia中转换Optional<BigDecimal>。我创建了BigDecimalConverter,它工作正常。现在我想创建OptionalConverter。

可选可以保存任何对象类型。在我的OptionalConverter.encode方法中,我可以提取底层对象,我想将其传递给默认的mongo转换。所以,如果有字符串,我只会得到字符串,如果有我的一个实体,我将得到编码实体。我该怎么办?

1 个答案:

答案 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。

对于非常简单的情况,例如如果你不需要处理所有可能的参数类型,并且在阅读时没有歧义,那么它可能是可能的。