我正在尝试将 a 映射DateMidnight
到LocalDate
using orika。但无论我尝试什么,我都会收到此错误ma.glasnost.orika.MappingException: No concrete class mapping defined for source class org.joda.time.chrono.ISOChronology
。但它只在詹金斯服务器(unix)上失败,而不是在本地(win)上失败。
DateMidnight
从to的映射LocaleDate
配置如下:
public LocaleDate convert(DateMidnight source, Type<? extends LocaleDate> destinationType) {
if (source == null) { return null; }
return new LocaleDate(source);
}
无论如何,我尝试在 jodatime 中找到的年表之间添加具体映射。
例如
ISOChronology
->ISOChronology
ISOChronology
->Chronology
Chronology
->ISOChronology
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
。
任何帮助将不胜感激
编辑 - 解决方案和更多信息
所以,我在第一次注册一个ObjectFactory
for Chronology
using后找到了一个解决方案MapperFactory.registerObjectFactory
。
然后代码失败并出现异常,解释了 280hoursInDay
在创建LocaleDateTime
. 现在,所有映射器都设置为映射 from DateMidnight
to 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
,并尝试使用 initialize 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。这可能不是解决此问题的最佳方法。但这是一个解决方案。如果有人知道如何以更好的方式解决这个问题,请告诉我。