7

我有一个用户实体和一个角色实体。除了 User 实体有一个对应于其各自角色的 id 的 role_id 字段之外,这些字段并不重要。由于 Spring Data R2DBC 不会在实体之间建立任何形式的关系,因此我转向 DTO 方法。我对 R2DBC 和响应式编程作为一个整体非常陌生,我一生都无法弄清楚如何将Flux<User>我的存储库的 findAll() 方法转换为Flux<UserDto>. 我的 UserDto 类非常简单:

@Data
@RequiredArgsConstructor
public class UserDto 
{
    private final User user;

    private final Role role;
}

这是我正在尝试制作的 UserMapper 类:

@Service
@RequiredArgsConstructor
public class UserMapper 
{
    private final RoleRepository roleRepo;

    public Flux<UserDto> map(Flux<User> users)
    {
        //???
    }
}

如何让这个映射器将 aFlux<User>转换为Flux<UserDto>包含用户各自角色的 a?

谢谢!

4

2 回答 2

5

假设您RoleRepository有一个findById()方法或类似的方法来查找Role给定的 ID,并且您的用户对象有一个getRoleId(),您可以通过标准 map 调用来做到这一点:

return users.map(u -> new UserDto(u, roleRepo.findById(u.getRoleId())));

或者在findById()返回 a的情况下Mono

return users.flatMap(u -> roleRepo.findById(u.getRoleId()).map(r -> new UserDto(u, r)));

如果getRoleId()可能返回 null,您当然可能想要添加额外的检查。

于 2019-11-04T08:10:02.720 回答
0

将数据从业务对象转换为数据库对象:

private static UserDAO covertUserBOToBUserDAO(UserBO userBO){
    return new UserDAO(userBO.getUserId(), userBO.getName(), userBO.getMobileNumber(), 
     userBO.getEmailId(), userBO.getPassword());
}

将数据从数据库对象转换为业务对象:

private static Mono<UserBO> covertUserDAOToBUserBO(UserDAO userDAO){
    return Mono.just(new UserBO(userDAO.getUserId(), userDAO.getName(), 
     userDAO.getMobileNumber(), userDAO.getEmailId(), userDAO.getPassword()));
}

现在异步服务(getAllUsers):

public Flux<UserBO> getAllUsers(){
        return userRepository.findAll().flatMap(UserService::covertUserDAOToBUserBO);
}

由于 flatMap 是异步的,所以我们可以从异步操作中受益,甚至可以将对象从 DAO 转换为 BO。

同样,如果保存数据,那么我在下面尝试:

public Mono<UserBO> saveUser(UserBO userBO)
{
        return 
 userRepository.save(covertUserBOToBUserDAO(userBO)).flatMap(UserService::covertUserDAOToBUserBO);
}
于 2020-08-09T01:01:43.570 回答