Mapstruct: как использовать пользовательские картографы с @MappingTarget - PullRequest
0 голосов
/ 12 апреля 2019

Я использую Mapstruct, и мне нужно обновить существующий компонент, используя @MappingTarget, но мне нужно применить некоторую сложную логику, чтобы установить правильное поле в цели.

Допустим, у меня есть целевой компонент, которыйвыглядит такУ пользователя есть список учетных записей, и одна из этих учетных записей помечена как избранная.

UserDetails {
  String name;
  List<Account> accounts;
}

Account {
  String id;
  boolean favourite;
}

Класс DTO содержит идентификатор учетной записи своей любимой учетной записи.

UserDetialsDTO {
  String name;
  String favouriteAccountId;
  List<String> accountIds;
}

Мне нужноиспользовать некоторую сложную логику для обновления правильного Account в списке счетов

UserDetails fromDto(UserDetialsDTO dto, @MappingTarget UserDetails userDetails);

Логика поиска и обновления правильного Account, чтобы сделать его любимым, выглядит примерно так:

userDetails.accounts
           .stream()
           .forEach(acct -> acct.setFavourite(dto.favouriteAccountId.equals(acct.id))) ;

Как я могу сказать Mapstruct использовать этот пользовательскийлогика при обновлении @MapingTarget?

1 Ответ

1 голос
/ 13 апреля 2019

попробовать:

    @Mapper 
    public interface MyMapper {

         @Mapping( target = "accounts", ignore = true ) 
         void fromDto(UserDetialsDTO dto, @MappingTarget UserDetails userDetails);

         @AfterMapping
         default void handleAccounts(UserDetialsDTO dto, @MappingTarget UserDetails userDetails) {
             userDetails.accounts
               .stream()
               .forEach(acct -> acct.setFavourite(dto.favouriteAccountId.equals(acct.id))) ;
         }
    }
...