当前位置: 首页 > 知识库问答 >
问题:

使用MapSTRt将成员变量转换为id(反之亦然)

慕宏峻
2023-03-14

在我的SpringBoot应用程序中,我有两个实体UserRole

public class User {
    private Long id;
    private String email;
    private String password;
    private Set<Role> roles;

    [...]
}

public class Role {
    private Long id;
    private String name;
    private Set<User> users;

    [...]
}

我的DTO看起来非常相似,直到我意识到这可能会导致递归问题,当一个用户有一个字段角色,它有一个相同用户的字段,它有一个相同角色的字段,等等。

因此,我决定只把ids交给我的DTO,所以它们看起来像这样

public class UserDto {

    private Long id;
    private String email;
    private String password;
    private List<Long> roleIds;
}

public class RoleDto {
    private Long id;
    private String name;
    private List<Long> userIds;
}

我的制图器很简单,以前是这样的

import org.mapstruct.Mapper;
@Mapper
public interface UserMapper {
    User userDtoToUser(UserDto userDto);
    UserDto userToUserDto(User user);
    List<UserDto> userListToUserDtoList(List<User> users);
}


import org.mapstruct.Mapper;
@Mapper
public interface RoleMapper {
    Role roleDtoToRole(RoleDto roleDto);
    RoleDto roleToRoleDto(Role Role);
    List<RoleDto> roleListToRoleDtoList(List<Role> roles);
}

我将如何更改它们,以便他们将用户转换为/从userIds角色转换为/从角色Ids

共有1个答案

凌远
2023-03-14

角色rolesDtos用户usersDtos的单向映射非常简单

@Mapper
public interface RoleMapper {

    List<RoleDto> roleListToRoleDtoList(List<Role> role);

    @Mapping(target = "userIds", source = "users", qualifiedByName = "userListToUserDtoList")
    RoleDto roleToRoleDto(Role role);

    @Named("userListToUserDtoList")
    default List<Long> userListToUserDtoList(Set<User> users) {
        return users.stream().map(User::getId).collect(Collectors.toList());
    }
}

@Mapper
public interface UserMapper {

    List<UserDto> userListToUserDtoList(List<User> users);

    @Mapping(target = "roleIds", source = "roles", qualifiedByName = "roleListToRoleDtoList")
    UserDto userToUserDto(User user);

    @Named("roleListToRoleDtoList")
    default List<Long> roleListToRoleDtoList(Set<Role> roles) {
        return roles.stream().map(Role::getId).collect(Collectors.toList());
    }
}

真正的问题是地图

User userDtoToUser(UserDto userDto);

Role roleDtoToRole(RoleDto roleDto);

因为这里MapSTRt不知道如何将userIds转换为user,所以您需要一些机制来获取每个userId并将其解析为整个对象。如果您使用Spring,您可以将映射器设为Spring bean-https://mapstruct.org/documentation/stable/reference/html/#using-dependency-injection或装饰器https://mapstruct.org/documentation/stable/reference/html/#decorators-with-spring注入适当存储库的“获取方法”。
,但在这里我将考虑是否值得挖掘或在方向映射中为您的递归案例实现一些专用方法。

 类似资料:
  • 我已经阅读了文档和示例,但我很难将其全部整理在一起。我只是尝试获取一个测试pdf文件,然后将其转换为字节数组,然后获取字节数组并将其转换回pdf文件,然后将pdf文件创建到磁盘上。 它可能没有多大帮助,但这是我目前得到的:

  • 问题内容: 我正在搜索轻量级API(最好是单个类)以转换 到xml,反之亦然,将XML转换回Map。 例: 结果: 然后回来: 我不想使用JAXB或JSON转换API。只需简单的情况,它就不必处理嵌套的地图或属性或其他任何内容。有什么建议么? 编辑:我创建了一个工作副本并粘贴示例。感谢fvu和Michal Bernhard。 下载最新的XStream框架,“仅核心”就足够了。 不需要转换器或其他任

  • 问题内容: 如何在Python中将HTML实体转换为Unicode,反之亦然? 问题答案: 您需要有BeautifulSoup。

  • 问题内容: 我正在寻找一种将NumPy数组传递给Matlab的方法。 我已经设法通过使用将数组存储到图像中,然后使用加载它来做到这一点,但这当然会使矩阵包含0到256之间的值,而不是“真实”值。 将这个矩阵的乘积除以256,再加上原始NumPy数组中的最大值,可以得出正确的矩阵,但是我觉得这有点乏味。 有没有更简单的方法? 问题答案: 当然,只要使用 举个例子: 同样,有。 然后,您使用将其加载到

  • 问题内容: 使用以下代码获取字符串并将其转换为二进制: 输出: 如果我将其放到该站点(位于右侧站点)中,则会得到hello回信。我想知道它使用什么方法。我知道我可以将二进制字符串拼接成8,然后将其与相应的值进行匹配或以其他方式进行匹配。真正在寻找更简单的东西。 问题答案: 对于[ -~]Python 2 范围内的ASCII字符: 相反: 在Python 3.2+中: 相反: 要在Python中支持

  • 问题内容: 我正在生成密钥,需要将其存储在数据库中,因此我将其转换为字符串,但是要从字符串中获取密钥。有哪些可能的方法可以做到这一点? 我的代码是 如何从字符串取回密钥? 问题答案: 您可以将转换为字节数组(),然后Base64将其编码为。要转换回a ,Base64 会对String进行解码,并在a中使用它来重建您的原始字符串。 对于Java 8 字符串的SecretKey: 字符串到Secret