繁体   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