MapStruct 将列表设置为字段

MapStruct set List as field

我在 Lombok 中使用 Map Struct 来回映射 DTO 和 Entity 但发生在一个案例中:

@Mapper(uses = {RoleMapper.class})
public interface UserMapper {

    UserDto userToUserDto(User user);

    default User signUpRequestDtoToUser(SignUpRequestDto dto) {
        return User.builder()
                .roles(dto.roleIds.stream().map(id -> Role.builder().id(id).build()).collect(Collectors.toList()))
                .username(dto.getUsername())
                .password(dto.getPassword())
                .isEnabled(dto.getIsEnabled())
                .build();
    }

    default UserFilter toUserFilter(UserFilterDto dto) {
        return UserFilter.builder()
                .isEnabled(dto.getIsEnabled())
                .username(dto.getUsername())
                .roles(
                        Objects.nonNull(dto.getRoleIds())
                                ? dto.getRoleIds().stream().map(id -> Role.builder().id(id).build()).collect(Collectors.toList())
                                : Collections.emptyList())
                .build();
    }
}

在其他情况下,我使用这样的注释:@Mapping(target = "advisor.id", source = "advisorId")id 创建对象。它在 parent 包含一个实例的情况下起作用。但是 UserUserFilterList<Role> 作为字段。

如何用注释替换default方法?

从我在你的例子中看到的,我假设你也可以在这种情况下使用注释:只需创建一个方法来映射 RoleIdRole 并且 Mapstruct 将实现这个方法并在尝试映射这些模型的集合时自动调用它的方法:

@Mapping(source = "id", target = "id")
Role mapRoleIdToRole(RoleId roleId);