2

我正在尝试将 a 映射DateMidnightLocalDateusing 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

任何帮助将不胜感激

编辑 - 解决方案和更多信息

所以,我在第一次注册一个ObjectFactoryfor Chronologyusing后找到了一个解决方案MapperFactory.registerObjectFactory

然后代码失败并出现异常,解释了 280hoursInDay在创建LocaleDateTime. 现在,所有映射器都设置为映射 from DateMidnightto 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,并尝试使用 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。这可能不是解决此问题的最佳方法。但这是一个解决方案。如果有人知道如何以更好的方式解决这个问题,请告诉我。

4

1 回答 1

5

我有类似的问题,您是否尝试过以下操作,也许它会有所帮助:

factory.getConverterFactory().registerConverter(new PassThroughConverter(org.joda.time.Chronology.class));
于 2016-04-06T19:50:02.833 回答