2017-06-20 33 views
1

Orika有一組「BuiltinConverters」是否有可能重寫Orika內置的轉換器 - 的XMLGregorianCalendar到java.util.Date?

https://github.com/orika-mapper/orika/blob/master/core/src/main/java/ma/glasnost/orika/converter/builtin/BuiltinConverters.java

但映射的XMLGregorianCalendar到java.util.Date不爲我正常工作之一。我發現了以令人滿意的結果映射它的方法,但我找不到使Orika使用它的方法,而不是使用它自己的內置轉換器。我試圖註冊該轉換器在MapperDefinition:

public class MapperDefinition { 

    private final MapperFactory factory; 
    private final ConverterFactory converterFactory; 

    public MapperDefinition() { 

    factory = new DefaultMapperFactory.Builder().build(); 
    converterFactory = factory.getConverterFactory(); 

    converterFactory.registerConverter(new CustomConverter<XMLGregorianCalendar, Date>() { 
     @Override 
     public Date convert(XMLGregorianCalendar source, Type<? extends Date> destinationType) { 
     LocalDateTime ldt = LocalDateTime.of(source.getYear(), source.getMonth(), 
      source.getDay(), source.getHour(), source.getMinute(), source.getSecond()); 
     return Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant()); 
     } 
    } 
    } 

} 

但調試表明Orika似乎忽略我的自定義轉換器,仍然使用它自己的內置轉換器。我也無法找到有關重寫它Orika用戶指南的任何信息:

https://orika-mapper.github.io/orika-docs/converters.html

有誰知道這是否可能使Orika用我的映射這兩種類型的方法是什麼?

+0

我假設你的代碼所做的就是它註冊在一個特定工廠的轉換器,但是映射器工廠可能在某些情況下返回不同的工廠。你確定你的應用程序使用你註冊的工廠嗎? –

回答

1

,我發現自己的答案。

問題是,內置的轉換器是一個「BidirectionalConverter」,我使用「CustomConverter」,因爲我只想以一種方式更改映射:XML - > Date。將其更改爲雙向解決了問題。

+0

無論轉換器雙向與否不應單向轉換關係,工廠仍不得不使用它與配置。看起來,你有一種可以通過一些副作用起作用的解決方法。 –

0

我想你可能想將它作爲報告的問題Orika傢伙,所以他們可以用自己的內置解決問題或以某種方式使其所以他們建宏不會覆蓋您註冊自定義轉換器。

作爲一種解決辦法,我建議你禁用生成器使用內建命令,並註冊您註冊所有的自定義轉換器和重寫後才內置轉換器。這應該給您的自定義轉換器,以抑制內建所需的優先級(至少他們目前DefaultConverterFactory工作如何判斷)。

代碼:

factory = new DefaultMapperFactory.Builder() 
    .useBuiltinConverters(false) 
    .build(); 
converterFactory = factory.getConverterFactory(); 

converterFactory.registerConverter(<... Your converter here ...>); 

BuiltinConverters.register(converterFactory); 
相關問題