我正在使用 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?
尝试:
@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)