Spring WebFlux中获取集合子记录时如何返回DTO的Flux?
Spring WebFlux 实现嵌套关联数据查询(User + Phone 转 UserDTO)
你的代码存在几个关键问题:
- 第一个
flatMap把Flux<User>转换成了Flux<Phone>,直接丢失了原User的上下文信息,后续无法获取原用户数据来构建UserDTO - 第二个
flatMap里尝试引用外部的u和phoneNumbers变量,这在Lambda作用域中是无效的,编译都会报错 - 你的需求是每个用户对应一组手机号,但原代码会把每个手机号都转成一个
UserDTO,完全不符合预期
以下是正确的实现方式:
public Flux<UserDTO> getUsers(String name) { Flux<User> users = userRepo.findByNameLike(name); // 遍历每个User,查询关联手机号并组装UserDTO return users.flatMap(user -> // 查询当前用户的所有手机号,收集为List phoneNumberRepo.findByUserId(user.getUserId()) .collectList() // 将User和对应的手机号列表映射为UserDTO .map(phoneList -> { UserDTO userDto = new UserDTO(); userDto.setUserId(user.getUserId()); userDto.setPhoneNumbers(phoneList); // 按需补充User的其他字段到DTO userDto.setName(user.getName()); return userDto; }) ); }
代码逻辑说明:
- 先通过
userRepo获取匹配名称的Flux<User> - 对每个
User使用flatMap,开启异步查询其关联的Phone数据 - 用
collectList()将Flux<Phone>转换为Mono<List<Phone>>,把当前用户的所有手机号收集成一个集合 - 通过
map操作,将原User的属性和收集到的手机号列表一起组装成UserDTO - 最终
flatMap会把所有Mono<UserDTO>合并为Flux<UserDTO>,返回给调用方
如果你的UserDTO有构造函数可以直接传入User和List<Phone>,代码还能更简洁:
// 假设UserDTO有这样的构造函数:public UserDTO(User user, List<Phone> phones) return users.flatMap(user -> phoneNumberRepo.findByUserId(user.getUserId()) .collectList() .map(phones -> new UserDTO(user, phones)) );
内容的提问来源于stack exchange,提问作者newbie123
相关产品推荐
相关产品推荐

