Mapstruct:如何将自定义映射器与@MappingTarget一起使用

时间:2019-04-12 11:30:33

标签: mapstruct

我正在使用Mapstruct,我需要使用@MappingTarget更新现有的bean,但是需要应用一些复杂的逻辑来在目标中设置正确的字段。

可以说我有一个看起来像这样的目标bean。用户拥有一个帐户列表,其中一个帐户被标记为收藏。

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

Account {
  String id;
  boolean favourite;
}

DTO类包含他们喜欢的帐户的帐户ID。

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))) ;

如何在更新@MapingTarget时告诉Mapstruct使用此自定义逻辑?

1 个答案:

答案 0 :(得分:1)

尝试:

    @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))) ;
         }
    }