Пользовательское поведение для источника, назначения ModelMapper.map - PullRequest
0 голосов
/ 18 июня 2019

Я хочу использовать 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
    }
}

Мы ожидаем заменить реализацию updateB инструкцией modelMapper, которая отображаетвсе поля и отслеживает исторические изменения для добавления в базу данных.

Наш текущий код работает, но требует повторной реализации исторического события для каждого поля вместо того, чтобы записывать реализацию один раз и позволять modelMapper выполнять тяжелую работу.

...