简体   繁体   English

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

[英]Reactor : How to convert a Flux of entities into a Flux of DTO objects

I have a User entity and a Role entity.我有一个用户实体和一个角色实体。 The fields are not important other than the fact that the User entity has a role_id field that corresponds to the id of its respective role.除了 User 实体有一个对应于其各自角色的 id 的 role_id 字段之外,这些字段并不重要。 Since Spring Data R2DBC doesn't do any form of relations between entities, I am turning to the DTO approach.由于 Spring 数据 R2DBC 不会在实体之间建立任何形式的关系,因此我转向 DTO 方法。 I am very new to R2DBC and reactive programming as a whole and I cannot for the life of me figure out how to convert the Flux<User> my repository's findAll() method is returning me to a Flux<UserDto> .我对 R2DBC 和整个反应式编程非常陌生,我一生都无法弄清楚如何转换Flux<User>我的存储库的 findAll() 方法将我返回到Flux<UserDto> My UserDto class is extremely simple:我的 UserDto class 非常简单:

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

    private final Role role;
}

Here is the UserMapper class I'm trying to make:这是我正在尝试制作的 UserMapper class:

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

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

How can I get this mapper to convert a Flux<User> into a Flux<UserDto> containing the user's respective role?如何让这个映射器将Flux<User>转换为包含用户各自角色的Flux<UserDto>

Thanks!谢谢!

Assuming your RoleRepository has a findById() method or similar to find a Role given its ID, and your user object has a getRoleId() , you can just do it via a standard map call:假设您的RoleRepository有一个findById()方法或类似的方法来查找给定 ID 的Role ,并且您的用户 object 有一个getRoleId() ,您可以通过标准的 map 调用来完成它:

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

Or in the case where findById() returns a Mono :或者在findById()返回Mono的情况下:

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

You may of course want to add additional checks if it's possible that getRoleId() could return null.如果getRoleId()可能返回 null,您当然可能想要添加额外的检查。

Converting the data from business object to database object:将业务object的数据转换为数据库object:

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

Converting the data from database object to business object:将数据库 object 中的数据转换为业务 object:

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

Now in service (getAllUsers) asynchronously:现在异步服务(getAllUsers):

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

Since flatMap is asynchronous so we get the benefit from asynchronous operation for even converting the object from DAO to BO.由于 flatMap 是异步的,因此我们可以从异步操作中受益,甚至可以将 object 从 DAO 转换为 BO。

Similarly if saving data then I tried below:同样,如果保存数据,那么我在下面尝试:

public Mono<UserBO> saveUser(UserBO userBO)
{
        return 
 userRepository.save(covertUserBOToBUserDAO(userBO)).flatMap(UserService::covertUserDAOToBUserBO);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM