[英]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.