[英]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.