我正在使用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使用此自定义逻辑?
答案 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))) ;
}
}