0

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

Optional 可以容纳任何对象类型。在我的OptionalConverter.encode方法中,我可以提取底层对象,并且我想将它传递给默认的 mongo 转换。所以如果有字符串,我只会得到字符串,如果有我的实体之一,我会得到编码的实体。我该怎么做?

4

1 回答 1

-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 的准确类型信息。

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

于 2013-06-08T10:34:14.340 回答