Reactor:如何将实体 Flux 转换为 DTO 对象 Flux
Reactor : How to convert a Flux of entities into a Flux of DTO objects
我有一个用户实体和一个角色实体。这些字段并不重要,除了用户实体有一个 role_id 字段对应于其各自角色的 ID。由于 Spring Data R2DBC 不在实体之间建立任何形式的关系,因此我转向 DTO 方法。作为一个整体,我对 R2DBC 和反应式编程还很陌生,我终其一生都无法弄清楚如何将 Flux<User>
我的存储库的 findAll() 方法转换为 Flux<UserDto>
。我的 UserDto class 非常简单:
@Data
@RequiredArgsConstructor
public class UserDto
{
private final User user;
private final Role role;
}
这是我正在尝试制作的 UserMapper class :
@Service
@RequiredArgsConstructor
public class UserMapper
{
private final RoleRepository roleRepo;
public Flux<UserDto> map(Flux<User> users)
{
//???
}
}
如何让这个映射器将 Flux<User>
转换为包含用户各自角色的 Flux<UserDto>
?
谢谢!
假设你的 RoleRepository
有一个 findById()
方法或类似的方法来找到给定 ID 的 Role
,并且你的用户对象有一个 getRoleId()
,你可以这样做通过标准地图调用:
return users.map(u -> new UserDto(u, roleRepo.findById(u.getRoleId())));
或者如果 findById()
return 是 Mono
:
return users.flatMap(u -> roleRepo.findById(u.getRoleId()).map(r -> new UserDto(u, r)));
如果 getRoleId()
可能 return null,您当然可能想要添加额外的检查。
将数据从业务对象转换为数据库对象:
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);
}
我有一个用户实体和一个角色实体。这些字段并不重要,除了用户实体有一个 role_id 字段对应于其各自角色的 ID。由于 Spring Data R2DBC 不在实体之间建立任何形式的关系,因此我转向 DTO 方法。作为一个整体,我对 R2DBC 和反应式编程还很陌生,我终其一生都无法弄清楚如何将 Flux<User>
我的存储库的 findAll() 方法转换为 Flux<UserDto>
。我的 UserDto class 非常简单:
@Data
@RequiredArgsConstructor
public class UserDto
{
private final User user;
private final Role role;
}
这是我正在尝试制作的 UserMapper class :
@Service
@RequiredArgsConstructor
public class UserMapper
{
private final RoleRepository roleRepo;
public Flux<UserDto> map(Flux<User> users)
{
//???
}
}
如何让这个映射器将 Flux<User>
转换为包含用户各自角色的 Flux<UserDto>
?
谢谢!
假设你的 RoleRepository
有一个 findById()
方法或类似的方法来找到给定 ID 的 Role
,并且你的用户对象有一个 getRoleId()
,你可以这样做通过标准地图调用:
return users.map(u -> new UserDto(u, roleRepo.findById(u.getRoleId())));
或者如果 findById()
return 是 Mono
:
return users.flatMap(u -> roleRepo.findById(u.getRoleId()).map(r -> new UserDto(u, r)));
如果 getRoleId()
可能 return null,您当然可能想要添加额外的检查。
将数据从业务对象转换为数据库对象:
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);
}