ModelMapper 2.4.4与Groovy 3.0兼容性导致对象转换异常问题咨询
问题根因
该兼容性问题由Groovy 3的metaClass实现重构与ModelMapper 2.4.4的对象实例化逻辑冲突导致:
Groovy 3重构了类实例与metaClass的绑定逻辑,要求实例必须通过Groovy识别的初始化路径创建,才能正确绑定对应类的metaClass。而ModelMapper 2.4.4默认使用ASM字节码生成策略实例化目标类对象,生成的代理实例没有触发Groovy的metaClass绑定流程,内部反射缓存错误携带了源类的metaClass信息,最终导致生成的目标实例实际类型正确,但Groovy运行时绑定的metaClass仍为源类的metaClass,访问属性时会用源类的存取方法调用目标实例,抛出java.lang.IllegalArgumentException: object is not an instance of declaring class异常。
可行解决方案
- 升级ModelMapper版本:直接将ModelMapper升级到2.4.5及以上版本,该版本已专门适配Groovy 3的metaClass绑定逻辑,无需修改业务代码即可解决问题。
- 替换ModelMapper实例化策略:如果暂时无法升级ModelMapper版本,可修改ModelMapper配置,关闭字节码生成策略,改用反射方式实例化对象:
import org.modelmapper.spi.ReflectionProvider; ModelMapper modelMapper = new ModelMapper(); modelMapper.getConfiguration().setProvider(new ReflectionProvider());
该方案会让ModelMapper直接通过反射调用目标类的构造方法创建实例,正常触发Groovy的metaClass绑定流程。
- 手动绑定metaClass:如果仅需要临时修复少量场景的问题,可在拿到映射结果后手动为实例绑定目标类的metaClass:
TestClass mappedResult = new ModelMapper().map(test, TestClass) mappedResult.metaClass = TestClass.metaClass // 后续即可正常访问属性
内容的提问来源于stack exchange,提问作者Emily Johnson
相关产品推荐
相关产品推荐

