2013-05-20 49 views
0

我要轉換嗎啡中的Optional<BigDecimal>。我創建了BigDecimalConverter,它工作正常。現在我想創建OptionalConverter。Morphia轉換器呼叫其他轉換器

可選可以容納任何對象類型。在我的OptionalConverter.encode方法中,我可以提取底層對象,並且我想將它傳遞給默認的mongo轉換。所以,如果有字符串,我只會得到字符串,如果有我的實體之一,我會得到編碼的實體。我該怎麼做?

回答

-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的地圖創建一個轉換器,但沒有找到方法。無法在寫入時獲取源地圖的準確類型信息,或在讀取時獲取目標地圖的準確類型信息。

對於非常簡單的情況,例如如果你不需要處理所有可能的參數類型,並且在閱讀時沒有歧義,但它可能是可能的。