【问题标题】:How do I return different response in the webflux based on whether the Flux object has elements?如何根据 Flux 对象是否有元素在 webflux 中返回不同的响应?
【发布时间】:2021-10-07 16:47:51
【问题描述】:

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

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 函数似乎让我的通量对象为空,尽管我知道它实际上并没有这样做。

【问题讨论】:

  • 好吧,我想既然从flux对象中取出数据就知道它是否为空了,flux对象就变成了空的。我可以使用 collect() 来利用通量对象的元素,同时我可以知道元素的数量。但是当数据很大时这会花费很多,而且对于知道我的通量对象是否为空的要求来说似乎很愚蠢!

标签: flux reactor webflux


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在您的示例中,您将Flux 类转换为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());
    

    【讨论】:

      猜你喜欢
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-20
      • 1970-01-01
      相关资源
      最近更新 更多