ModelMapper 2.4.4和Groovy 3.0兼容性问题

yshpjwxd  于 2022-11-01  发布在  其他
关注(0)|答案(1)|浏览(178)

当从Groovy 2切换到Groovy 3时,ModelMapper 2.4.4现在似乎无法转换对象。ModelMapper本身并不抛出错误,而只是返回一个对象,该对象的metaClass仍然是初始类,而不是新的转换后类。
下面的代码演示了这一点,当在Groovy 3中运行时(在3.0.2和3.0.9中测试),当访问ModelMapping后返回的对象的任何属性时,会抛出java.lang.IllegalArgumentException: object is not an instance of declaring class。当在Groovy 2(2.5.15)中运行时,不会发生此错误。
相关性:
第一个

hfwmuf9z

hfwmuf9z1#

问题在于metaClass被自动Map(因此,testclass.metaClassTestClass.metaClass替换,groovy认为最终的对象是TestClass的一个示例)。
您可以在Map完成后显式设置元类:

def 'testMapping'() {
        given:
        TestClassDto test = new TestClassDto(fieldA: 'anyA', fieldB: 'anyB')
        def mapped = new ModelMapper().map(test, TestClass)
        mapped.metaClass = TestClass.metaClass

        expect:
        mapped.fieldA == 'anyA'
}

或者,使用@CompileStatic,这样就根本不会生成元类。
或者您甚至可以配置Modelmapper跳过元类:

mapper.typeMap(TestClassDto, TestClass)
                .addMappings({ it.skip(GroovyObject::setMetaClass) } as ExpressionMap)

相关问题