【问题标题】:MapStruct set List as fieldMapStruct 将 List 设置为字段
【发布时间】:2020-05-14 23:02:03
【问题描述】:

我正在使用带有 Lombok 的 Map Struct 来回映射 DTO 和实体,但发生在一个案例中:

@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方法?

【问题讨论】:

  • 龙目岛在这里的重要性是什么?这不只是一个@Mapper 的问题吗?
  • @Bohemian,不是很大,只是为了记录 Lombok 在项目中的使用。
  • 最好删除所有对 Lombok 的引用,因为它不相关并且会分散实际问题的注意力。 MCVE 也不错。

标签: java lombok mapstruct


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2023-02-10
    • 2022-08-19
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    • 2019-03-14
    • 1970-01-01
    • 2014-08-07
    相关资源
    最近更新 更多