ModelMapper无法映射组合字段,含环境变量的映射问题求助
解决ModelMapper复杂映射(含外部变量)的异常问题
问题原因
你之前的代码使用addMapping传入带外部变量domain的复杂lambda时,ModelMapper会尝试将该lambda解析为属性访问器(对应getter方法),但由于lambda逻辑包含外部变量且并非简单的属性读取,导致其反射解析机制出错,抛出IllegalArgumentException: object is not an instance of declaring class异常。
解决方案
无需给领域类新增getter或注入外部变量,可通过以下两种方式实现自定义映射:
方法1:使用Converter自定义转换逻辑
// 定义Converter,直接捕获外部变量domain Converter<Listing, String> linkConverter = context -> { Listing listing = context.getSource(); if (listing == null || listing.getLink() == null || StringUtils.isBlank(listing.getLink().getHref())) { return null; } return String.format("https://%s%s", domain, listing.getLink().getHref()); }; // 注册Converter到TypeMap ModelMapper modelMapper = new ModelMapper(); modelMapper.createTypeMap(Listing.class, Announce.class) .addMappings(mapper -> mapper.using(linkConverter).map(Listing::getLink, Announce::setLink));
方法2:在addMappings中直接传入逻辑lambda
ModelMapper modelMapper = new ModelMapper(); modelMapper.createTypeMap(Listing.class, Announce.class) .addMappings(mapper -> { mapper.map(source -> { if (source == null || source.getLink() == null || StringUtils.isBlank(source.getLink().getHref())) { return null; } return String.format("https://%s%s", domain, source.getLink().getHref()); }, Announce::setLink); });
说明
两种方式都绕开了ModelMapper的属性解析机制,直接执行自定义逻辑,既不需要修改领域类,也能正常引入外部环境变量domain。执行映射时直接调用modelMapper.map(listing, Announce.class)即可正常工作。
内容的提问来源于stack exchange,提问作者Rafael Lima
相关产品推荐
相关产品推荐

