You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:54:18