java - jodatime DateMidnight 的 Orika 映射

标签 java jenkins mapping orika

我正在尝试使用 orikaDateMidnight 映射到 LocalDate 。但无论我尝试什么,我都会收到此错误 ma.glasnost.orika.MappingException:没有为源类 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 -> 年表

年表 -> 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();
}

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

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

最佳答案

我遇到了类似的问题,您是否尝试以下操作,也许有帮助:

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

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

相关文章:

java - 在 Spring MVC 应用程序中查找内存泄漏

java - 用于管理一年中休息日的日期 API?

docker - 如何在 Jenkins 中将外部 URL 显示为构建结果

java - Gradle在Jenkins中构建JaCoCo jacocoTestReport时排除预构建的jar和类

java - 字节数组作为外部程序的标准输入/输出。

java - 如何使用泛型指定与 Comparable 类型的父类(super class)关系

jenkins - Jenkins 给我空白页

dynamic - 为嵌套文档定义动态 not_analyzed 字段

scala - 是否有类似适用于Scala的AutoMapper?

java mapstruct 1.3.1 忽略双向 DTO 映射列表中的属性