首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >反应堆:如何将实体的通量转换为DTO对象的通量

反应堆:如何将实体的通量转换为DTO对象的通量
EN

Stack Overflow用户
提问于 2019-11-04 03:05:00
回答 2查看 8.1K关注 0票数 9

我有一个用户实体和一个角色实体。除了用户实体有一个与其各自角色的id相对应的role_id字段之外,字段并不重要。由于Spring R2DBC没有在实体之间执行任何形式的关系,所以我转而使用DTO方法。作为一个整体,我对R2DBC和反应性编程非常陌生,我不知道如何将Flux<User> --我的存储库的findAll()方法--返回到Flux<UserDto>。我的UserDto类非常简单:

代码语言:javascript
运行
复制
@Data
@RequiredArgsConstructor
public class UserDto 
{
    private final User user;

    private final Role role;
}

下面是我要做的UserMapper类:

代码语言:javascript
运行
复制
@Service
@RequiredArgsConstructor
public class UserMapper 
{
    private final RoleRepository roleRepo;

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

如何使此映射程序将Flux<User>转换为包含用户各自角色的Flux<UserDto>

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-04 08:10:02

假设您的RoleRepository有一个findById()方法或类似的方法来查找给定其ID的Role,并且您的用户对象有一个getRoleId(),那么您可以通过一个标准的映射调用来完成它:

代码语言:javascript
运行
复制
return users.map(u -> new UserDto(u, roleRepo.findById(u.getRoleId())));

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

代码语言:javascript
运行
复制
return users.flatMap(u -> roleRepo.findById(u.getRoleId()).map(r -> new UserDto(u, r)));

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

票数 6
EN

Stack Overflow用户

发布于 2020-08-09 01:01:43

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

代码语言:javascript
运行
复制
private static UserDAO covertUserBOToBUserDAO(UserBO userBO){
    return new UserDAO(userBO.getUserId(), userBO.getName(), userBO.getMobileNumber(), 
     userBO.getEmailId(), userBO.getPassword());
}

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

代码语言:javascript
运行
复制
private static Mono<UserBO> covertUserDAOToBUserBO(UserDAO userDAO){
    return Mono.just(new UserBO(userDAO.getUserId(), userDAO.getName(), 
     userDAO.getMobileNumber(), userDAO.getEmailId(), userDAO.getPassword()));
}

现在在服务中(getAllUsers)异步:

代码语言:javascript
运行
复制
public Flux<UserBO> getAllUsers(){
        return userRepository.findAll().flatMap(UserService::covertUserDAOToBUserBO);
}

,因为flatMap是异步的,所以我们可以从异步操作中获得好处,甚至可以将对象从DAO转换为BO.

类似地,如果保存数据,那么我尝试如下:

代码语言:javascript
运行
复制
public Mono<UserBO> saveUser(UserBO userBO)
{
        return 
 userRepository.save(covertUserBOToBUserDAO(userBO)).flatMap(UserService::covertUserDAOToBUserBO);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58686680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档