[英]Orika mapping of jodatime DateMidnight
我正在嘗試使用orika將DateMidnight
映射到LocalDate
中。 但是,無論我嘗試什么,都會遇到此錯誤ma.glasnost.orika.MappingException: No concrete class mapping defined for source class org.joda.time.chrono.ISOChronology
。 但是它僅在詹金斯服務器(unix)上失敗,而不是本地(win)。
從DateMidnight
到LocaleDate
的映射配置如下:
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
注冊了一個用於Chronology
的ObjectFactory
后,找到了一個解決方案。
然后,代碼失敗,並出現異常,說明在創建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();
}
}
從XMLPeriod
到Period
的映射器使用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.