【发布时间】:2020-05-06 23:54:25
【问题描述】:
我的代码:
public Mono<ResponseEntity<Flux<TreeItem>>> allGroups(
@PathVariable(value = "email") String email, ServerWebExchange exchange) {
return Mono.just(
userGroupService
.findGroupByEmail(email) //Flux<GroupById>
.flatMap(getGroups(email)) //Flux<TreeItem>
.map(TreeItem::getId) //Flux<UUID>
.collectList() //Mono<List<UUID>>
.flatMap(getFilteredGroupIdsForUserPrivilege())
.flatMapMany(Flux::fromIterable) //Flux<UUID>
.flatMap(getUserTreeGroups(email)))
.map(ResponseEntity::ok)
.defaultIfEmpty(ResponseEntity.notFound().build()); --> is not executed at all when no data are returned
当我传递不存在的电子邮件时,我的代码返回带有空数组的响应 200:[]
在这种情况下,我想返回404 error - 为什么最后一行没有执行?
.defaultIfEmpty(ResponseEntity.notFound().build());
getUserTreeGroups 方法:
private Function<UUID, Publisher<? extends TreeItem>> getUserTreeGroups(String email) {
return filteredGroupId -> userGroupService
.findUserTreeGroup(filteredGroupId, email);
}
和方法findUserTreeGroup:
public Mono<GroupTreeItem> findUserTreeGroup(UUID groupId, String email) {
return groupByIdRepo.findById(groupId)
.flatMap(group -> findChildData(email, group));
}
我想向前端返回一个 TreeItem 列表。
老实说 - 我仍然不明白何时使用 Mono<ResponseEntity<Flux<TreeItem>>> 或 Mono<ResponseEntity<List<TreeItem>>>?有什么区别?
更新 应用 Thomas Andolf 的解决方案后:
public Mono<ResponseEntity<Flux<TreeItem>>> userAllTreeGroups(
@PathVariable(value = "email") String email, ServerWebExchange exchange) {
return userGroupService
.findUserGroupByEmail(email) //Flux<GroupById>
.flatMap(groupById -> userGroupService.findUserTreeGroup(groupById.getId(), email)) //Flux<TreeItem>
.map(TreeItem::getId) //Flux<UUID>
.collectList() //Mono<List<UUID>>
.flatMap(groupIds ->
rolePrivilegesService.filterGroupIdsForUserPrivilege(groupIds, GROUP_USER_READ_PRIVILEGE))
.flatMapMany(Flux::fromIterable) //Flux<UUID>
.flatMap(filteredGroupId -> userGroupService.findUserTreeGroup(filteredGroupId, email)) //Flux<GroupItem>
.collectList() //Mono<List<TreeItem>>
.map(ResponseEntity::ok) //Mono<ResponseEntity<List<TreeItem>>>
.defaultIfEmpty(ResponseEntity.notFound().build());
但我仍然必须返回 Mono>>。
你认为我的方法应该返回什么? Mono>> 喜欢在您的解决方案中???
【问题讨论】:
-
能不能加个.log操作符分享日志?
-
你为什么要把所有东西都放在
Mono.just中?getUserTreeGroups(email)返回什么?你能发布这段代码吗 -
A 更新了我的帖子,添加了 1 个方法的实现。我想返回一个 List
-
这次你能不能真正包含我认为很明显的东西,
findUserTreeGroup的实现,因为你提供的代码只是一个毫无意义的高级函数。 -
添加了 findUserTreeGroup 的实现
标签: java reactive-programming spring-webflux