如何用ModelMapper将已设值反向映射至目标对象的另一字段?
解决ModelMapper中复用单次计算值映射到多个字段的问题
可以实现,核心思路是在PropertyMap的映射逻辑里先执行一次计算并缓存结果,再把这个结果同时赋值给目标对象的多个字段,不用重复调用会生成不同结果的转换器。
具体实现示例
假设你有一个源类Source,目标类Target包含两个需要赋值的字段fieldA和fieldB,计算逻辑每次调用结果不同:
// 源类 public class Source { private String data; // getter/setter } // 目标类 public class Target { private String fieldA; private String fieldB; // getter/setter }
然后定义PropertyMap时,在内部先计算出结果,再映射到两个字段:
ModelMapper modelMapper = new ModelMapper(); modelMapper.addMappings(new PropertyMap<Source, Target>() { @Override protected void configure() { // 先执行一次计算,缓存结果 String computedValue = calculateUniqueValue(source); // 将缓存的结果同时赋值给两个目标字段 map().setFieldA(computedValue); map().setFieldB(computedValue); } // 模拟每次调用结果不同的计算逻辑 private String calculateUniqueValue(Source source) { return source.getData() + "-" + System.currentTimeMillis(); } });
关键说明
- 不要在两次
using(converter)中分别调用计算逻辑,而是在configure()方法内提前计算并保存结果,再复用这个结果赋值给多个字段。 - 如果你的计算逻辑是封装在
Converter里的,也可以在configure()中手动调用转换器的convert方法一次,缓存结果后再复用:
// 假设已有自定义转换器 Converter<Source, String> uniqueConverter = context -> { Source s = context.getSource(); return s.getData() + "-" + System.currentTimeMillis(); }; modelMapper.addMappings(new PropertyMap<Source, Target>() { @Override protected void configure() { String computedValue = uniqueConverter.convert(MappingContext.of(source)); map().setFieldA(computedValue); map().setFieldB(computedValue); } });
这样就能保证只执行一次计算,同时给多个目标字段赋值,避免因重复计算导致的结果不一致问题。
内容的提问来源于stack exchange,提问作者Rayyan
相关产品推荐
相关产品推荐

