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

veg*_*4me 1 java mapstruct

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

假设我有一个如下所示的目标 bean。用户有一个帐户列表,其中一个帐户被标记为最喜欢的。

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

Account {
  String id;
  boolean favourite;
}
Run Code Online (Sandbox Code Playgroud)

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

UserDetialsDTO {
  String name;
  String favouriteAccountId;
  List<String> accountIds;
}
Run Code Online (Sandbox Code Playgroud)

我需要使用一些复杂的逻辑来更新Account帐户列表中的正确内容。

UserDetails fromDto(UserDetialsDTO dto, @MappingTarget UserDetails userDetails);
Run Code Online (Sandbox Code Playgroud)

查找并更新正确的内容Account以使其成为最爱的逻辑如下:

userDetails.accounts
           .stream()
           .forEach(acct -> acct.setFavourite(dto.favouriteAccountId.equals(acct.id))) ;
Run Code Online (Sandbox Code Playgroud)

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

Sja*_*aak 5

尝试:

    @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))) ;
         }
    }
Run Code Online (Sandbox Code Playgroud)