【问题标题】:How to return Flux<String> in ServerResponse in WebFlux如何在 WebFlux 的 ServerResponse 中返回 Flux<String>
【发布时间】:2022-01-06 10:31:10
【问题描述】:

我有一个返回 Flux 的 Jdbc 层。在返回数据时,fromPublisher 方法接受其他 Serializable 类,但该方法不接受 Flux。

方法 1

public Mono<ServerResponse> getNames(final ServerRequest request) {
               Flux<String> strings = Flux.just("a", "b", "c"); 
        return ServerResponse.ok().contentType(APPLICATION_JSON)
                .body(fromPublisher(response), String.class);
    }

上述方法是将 abc 组合为单个字符串。

我试过了,

return ServerResponse.ok()
                .contentType(APPLICATION_JSON)
                .body(BodyInserters.fromValue(response), List.class);

我也试过了。

 Mono<List<String>> mono = response.collectList();
ServerResponse.ok()
                .contentType(APPLICATION_JSON)
                .body(fromPublisher(mono, String.class));

但这也给出了运行时错误

> body' should be an object, for reactive types use a variant specifying
> a publisher/producer and its related element type

【问题讨论】:

  • Flux 是一个流而不是一个列表,所以如果你想返回一个流,直接返回 Flux,或者删除“fromPublisher”。如果您想返回一个列表,您可以在通量上执行 collectList 并将生成的 Mono 直接放入 body
  • 我也试过了。它仍然给我一个错误。
  • 请不要说“我也试过了”试过什么?所有我指出的?我没有看到我在上面的问题中指出的所有试验。另外,不要说“它仍然给我一个错误”什么错误?如果您不向我们展示您所做的事情,我们将无法帮助您。如果您希望得到帮助,请付出一些努力

标签: mono spring-webflux flux


【解决方案1】:

以下是如何在响应正文中发回Flux&lt;String&gt; 的示例

Flux<String> strings = Flux.just("a", "b", "c");
ServerResponse.ok().body(strings, String.class);

【讨论】:

  • 这不是作为列表返回,而是在响应正文中作为单个字符串返回 abc。
  • 您没有要求将其作为问题列表返回。您要求返回 Flux&lt;String&gt;,您就是这样做的
  • 哦,好的。我的意思是字符串列表。我的坏。
【解决方案2】:

这是有效的。

Mono<List<String>> strings = Flux.just("a", "b", "c").collectList();
 
return strings.flatMap(string -> ServerResponse.ok()
                        .contentType(APPLICATION_JSON)
                        .bodyValue(string));

【讨论】:

    猜你喜欢
    • 2018-12-19
    • 2018-10-11
    • 2020-12-16
    • 2021-09-09
    • 2018-02-04
    • 2021-09-28
    • 1970-01-01
    • 2020-02-14
    • 2018-07-03
    相关资源
    最近更新 更多