0

我知道 Flux 对象上有一个名为“hasElements”的函数。但它的行为有点奇怪!</p>

Flux<RoomBO> rooms=serverRequest.bodyToMono(PageBO.class).flatMapMany(roomRepository::getRooms);
return rooms.hasElements().flatMap(aBool -> aBool?ServerResponse.ok().body(rooms,RoomBO.class):ServerResponse.badRequest().build());
return ServerResponse.ok().body(rooms,RoomBO.class)

当flux对象不为空时,第二个return语句可以返回我需要的正确的东西,但是第一个return语句只返回一个空数组,类似于json中的“[]”。我不知道为什么会发生这种情况!我使用相同的数据进行测试。唯一的区别是我在第一种情况下调用了hasElements函数。但是我需要在flux对象为空时返回badRequest。hasElements 函数似乎使我的通量对象为空,尽管我知道它实际上并没有这样做。

4

2 回答 2

0

好吧,最后我决定调用 switchIfEmpty(Mono.error()) 来抛出一个错误,然后我全局处理特殊错误(有时不适合使用 onErrorReturn 或 onErrorResume)。我认为这样可以避免遇到大数据时在内存中的收集操作。但它仍然不是一个好的解决方案,因为全局错误处理程序可能难以维护。我希望有人能提供更好的解决方案。

于 2021-08-05T13:44:58.443 回答
0

在您的示例中,您正在将 class 转换Flux为 class RoomBO,这是您获得空数组的原因之一。

如果您需要返回已处理的房间列表,那么我认为collectList应该是您的选择。https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Flux.html#collectList--

Flux<RoomBO> roomsFlux = serverRequest.bodyToMono(PageBO.class)
    .flatMapMany(roomRepository::getRooms);
return rooms
    .collectList()
    .flatMap(rooms -> !rooms.isEmpty() ? ServerResponse.ok().bodyValue(rooms) : ServerResponse.badRequest().build());
于 2021-11-28T19:44:10.693 回答