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