gpt4 book ai didi

java - jodatime DateMidnight的Orika映射

转载 作者:行者123 更新时间:2023-11-29 03:00:46 24 4
gpt4 key购买 nike

我正在尝试使用 orikaDateMidnight 映射到 LocalDate .但无论我尝试什么,我都会收到此错误 ma.glasnost.orika.MappingException: No concrete class mapping defined for source class org.joda.time.chrono.ISOChronology。但它只在 jenkins 服务器(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

年表 -> 年表

使用 registerClassMap 如下所示:

mapperFactory.registerClassMap(mapperFactory.classMap(ISOChronology.class, ISOChronology.class).byDefault().toClassMap());

ISOChronology -> ISOChronology 在为 org.joda.time.chrono.ISOChronology 创建对象工厂时给了我异常

任何帮助将不胜感激

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

因此,我首先使用 MapperFactory.registerObjectFactoryChronology 注册了一个 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();
}
}

XMLPeriodPeriod 的映射器使用了 field("fom", "from")field("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();
}

是的,重命名参数解决了问题...

附言。这可能不是解决此问题的最佳方法。但这是一个解决方案。如果有人知道如何以更好的方式解决这个问题,请告诉我。

最佳答案

我遇到了类似的问题,您是否尝试过以下方法,也许它有帮助:

factory.getConverterFactory().registerConverter(new PassThroughConverter(org.joda.time.Chronology.class));

关于java - jodatime DateMidnight的Orika映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35130700/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com