繁体   English   中英

Spring boot WebFlux:如何编写 Mono.map() 返回值?

[英]Spring boot WebFlux : How to write Mono.map() return value?


//Entity
class User{
    rivate Long id;
    private Sting name;
}
class Role{
    private Integer id;
    private String name;
}
class Permission{
    private Integer id;
    private String name;
    private String uri;
}
//Dto
class RoleDto extends Role{   
    private List<Permission> permissions;
}
class UserDto extends User{
    private List<RoleDto> roles;
}

//Service functions
public Mono<SysUser> getUserById(Long userId){
    return userRepository.findSysUserById(userId);
}

public Mono<UserDto> getUserInfoByUserId(Long userId){
    return getUserById(userId).map(user -> {
        UserDto userDto = new UserDto(user);
        roleService.getRolesByUserId(userId).map(roles -> {
            roles.forEach(role -> {
                RoleDto roleDto = new RoleDto(role);
                permissionService.getPermissionsByRoleId(role.getId()).map(plist ->{
                    roleDto.setPermissions(plist);
                    userDto.addRoles(roleDto);
                    return Mono.just(roleDto);//1 Here how to write
                }).subscribe();
            });
            return Mono.just(roles);//2 Here how to write
        }).subscribe();
        return Mono.just(userDto); //3 Here how to write
    });
}

例外是:

所需类型:Mono 提供:Mono 不存在类型变量 T 的实例,因此 Mono 符合 UserDto 推理变量 R 具有不兼容的边界:等式约束:UserDto 下限:Mono

如何编写函数 getUserInfoByUserId ?

假设您总是从存储库方法返回 Mono,您可以这样做

class DoStuff {
  Mono<User> getUserById(Long userId){
    return Mono.just(new User(1L, "test"));
  }

  Mono<List<Role>> getRolesByUserId(Long userId) {
    return Mono.just(Arrays.asList(new Role(1, "guest")));
  }

  Mono<List<Permission>> getPermissionsByRoleId(Integer roleId) {
    return Mono.just(Arrays.asList(new Permission(1, "read", "http://some-url")));
  }

  public Mono<UserDto> getUserInfoByUserId(Long userId){
    return getUserById(userId)
        .flatMap(user -> getRolesByUserId(userId)
            .flatMap(roles -> Flux.fromIterable(roles)
                .flatMap(role -> getPermissionsByRoleId(role.id)
                    .map(p -> new RoleDto(role, p)))
                .collectList()
                .map(roleDtos -> new UserDto(user, roleDtos))
            )
        );
  }
}

我建议您开始使用不可变的 java 对象,因为您正在处理 webflux 流。 它让生活变得轻松很多。

暂无
暂无

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

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