源,目标ModelMapper.map的自定义行为

时间:2019-06-18 18:51:46

标签: java listener modelmapper

我想使用ModelMapper快速将我的dto映射到entity对象,反之亦然,但是当成功写入数据库时​​,我还需要记录事务

我希望使用某种包装器来扩展ModelMapper

  1. 检查源值和目标值是否存在差异

  2. 格式化要添加到“历史记录”表(这是功能请求)的给定对象的数据更改

  3. 对象成功更新后,将所有历史更改记录写入数据库

对于此请求,我们需要在易于格式化的3NF表中跟踪任何现场数据更改,然后可以将其读取到历史记录部分中。在某些情况下,我们的旧对象被修补,而其他对象被完全覆盖,因此,虽然对象A可能具有更新一个字段的服务,而对象B却具有立即更新所有字段的服务

到目前为止,我们已经尝试使用可能有效的方面,但是解决方案很复杂,并且涉及ThreadLocal并发。我们还尝试了Spring EventListener,但是这种情况下仍然容易发生比我们认为绝对必要更多的代码重复。

public class ServiceA {

    // this method is only executed if the amounts are different
    // this is checked by the front end
    public void updateAmount(int amount, A entity){
         int oldAmount = entity.amount;
         entity.amount = amount;
         // add historic record changed A's amount from 'oldAmount' to 'amount'
         // save A
         // save historic record if A saves
}

public class ServiceB {


    @Autowired
    private ModelMapper modelMapper;

    public void updateB(DTO dto, A entity){
         // We want to replace this with
         // entity = modelMapper.map(dto, entity)
         if(dto.amount != entity.amount){
            // add historic record changes amount
            entity.amount = dto.amount;
         }
         if(dto.price != entity.price){
            // add historic record changed price
            entity.price = dto.price;
         }
         // save B
         // save historic records if B saves
    }
}

我们期望用modelMapper指令替换updateB实现,该指令映射所有字段并跟踪历史更改以追加到数据库。

我们当前的代码有效,但需要重新实现每个字段的历史事件,而不是一次编写实现并让modelMapper承担繁重的工作。

0 个答案:

没有答案