簡體   English   中英

Jodatime DateMidnight的Orika映射

[英]Orika mapping of jodatime DateMidnight

我正在嘗試使用orikaDateMidnight映射到LocalDate中。 但是,無論我嘗試什么,都會遇到此錯誤ma.glasnost.orika.MappingException: No concrete class mapping defined for source class org.joda.time.chrono.ISOChronology 但是它僅在詹金斯服務器(unix)上失敗,而不是本地(win)。

DateMidnightLocaleDate的映射配置如下:

public LocaleDate convert(DateMidnight source, Type<? extends LocaleDate> destinationType) {
    if (source == null) { return null; }
    return new LocaleDate(source);
}

無論如何,我嘗試在jodatime中找到的時間順序之間添加具體的映射。

例如

ISOChronology > ISOChronology

ISOChronology Chronology ISOChronology -> Chronology

Chronology -> ISOChronology Chronology

Chronology -> Chronology

使用registerClassMap ,如下所示:

mapperFactory.registerClassMap(mapperFactory.classMap(ISOChronology.class, ISOChronology.class).byDefault().toClassMap());

ISOChronology > ISOChronology exception while creating object factory for org.joda.time.chrono.ISOChronology給了我exception while creating object factory for org.joda.time.chrono.ISOChronology

任何幫助將不勝感激

編輯-解決方案和更多信息

因此,我首先使用MapperFactory.registerObjectFactory注冊了一個用於ChronologyObjectFactory后,找到了一個解決方案。

然后,代碼失敗,並出現異常,說明在創建LocaleDateTime時280不是有效的hoursInDay值。 現在,所有映射器都已設置為從DateMidnight映射到LocaleDate ,為什么它會嘗試初始化LocaleDateTIme對象...下面是它試圖映射到的Period類(從內存寫入)

public class Period {
    public final LocaleDate from;
    public final LocaleDate to;

    public Period() {}//Rank: 0

    public Period(LocaleDate from, LocaleDate to) {//Rank: 2000
        this.from = from;
        this.to = to;
    }

    public Period(LocaleDateTime from, LocaleDateTime to) {//Rank: 2000
        this.from = from.toLocaleDate();
        this.to = to.toLocaleDate();
    }
}

XMLPeriodPeriod的映射器使用field("fom", "from")field("to", "to")

事實證明,Orika的構造函數解析策略基於一種啟發式嘗試,試圖找到其可以滿足的參數數量最多的構造函數。 但是,試探法不會考慮您已注冊的映射或轉換器,而純粹是在查看參數名稱。

由於最后兩個構造函數具有相同的等級。 然后,它使用LocaleDate忽略構造函數,並嘗試使用初始化LocaleDateTime 然后,它殘酷地失敗了,因為它沒有LocaleDateTime的參數排序概念(並且也會失敗,因為ISOChonology是單例的,但是這是固定的)

所以...我所有問題的解決方案...

//DONT change wtf name, orika-mappings will break.
public Period(LocaleDateTime from, LocaleDateTime wtf) {
    this.from = from.toLocaleDate();
    this.to = wtf.toLocaleDate();
}

是的,重命名參數可以解決問題...

PS。 這可能不是解決此問題的最佳方法。 但這是一個解決方案。 如果有人知道如何更好地解決此問題,請告訴我。

我遇到了類似的問題,您是否嘗試了以下操作,也許有幫助:

factory.getConverterFactory().registerConverter(new PassThroughConverter(org.joda.time.Chronology.class));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM