Reactor:如何将实体通量转换为DTO对象通量

时间:2019-11-04 03:05:00

标签: java reactive-programming dto project-reactor spring-data-r2dbc

我有一个用户实体和一个角色实体。这些字段除了用户实体具有与其各自角色的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)
    {
        //???
    }
}

如何获取此映射器,将Flux<User>转换为包含用户各自角色的Flux<UserDto>

谢谢!

2 个答案:

答案 0 :(得分:2)

假设您的RoleRepository具有findById()方法或类似方法,以根据给定的ID查找Role,并且您的用户对象具有getRoleId(),则可以通过标准的地图调用:

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

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

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

如果getRoleId()可能返回null,那么您当然想添加其他检查。

答案 1 :(得分: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);
}