【问题标题】:spring webflux: how to send Mono<T> in response body with body insertersspring webflux:如何使用正文插入器在响应正文中发送 Mono<T>
【发布时间】:2018-06-06 07:16:49
【问题描述】:

该文档说:https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html

ServerResponse 提供对 HTTP 响应的访问。由于它是不可变的,因此您可以使用构建器创建一个 ServerResponse。构建器允许您设置响应状态、添加响应标头并提供正文。例如,这是如何创建具有 200 OK 状态、JSON 内容类型和正文的响应:

Mono<Person> person = ...
ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).body(person);

同样,我厌倦了将Mono&lt;T&gt; 传递给 ServerReponse Builder 的 body 方法,但出现以下错误:

代码sn-p:

编译错误

Mono<Inventory> inventoryMono=request.bodyToMono(Inventory.class);        
 return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).body(inventoryMono);

但它适用于以下代码:

ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).body(inventoryMono.doOnNext(inventoryRepository::save).log(),Inventory.class)

我错过了什么?

【问题讨论】:

  • 你试过了吗,ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).body(inventoryMono,inventory.class);

标签: spring spring-boot spring-webflux


【解决方案1】:

您的情况可以根据documentation进行说明。由于您尝试返回 Mono(继承自 Publisher 类),因此您必须将类指定为 body 方法中的第二个参数,如下所示。

.body(inventoryMono, Inventory.class)

在您的第二个代码 sn-p 中,您将 Inventory.class 作为第二个参数,这就是它起作用的原因。只需将其添加到您的第一个代码 sn-p

【讨论】:

    【解决方案2】:

    我确定这是文档的问题,因为ServerResponse.BodyBuilder 不包含这种方法。只有一个名为 body 的单参数方法采用 BodyInserter,因此您必须将 Mono 转换为 BodyInserter(例如使用 BodyInserters.fromObject)。

    【讨论】:

    • 是的,但我会传递一种反应流类型,而不是使用 BodyInserters.fromObject。让我们希望框架支持进行转换
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 2020-06-04
    • 1970-01-01
    • 2015-04-18
    • 2017-12-25
    • 2022-07-22
    • 1970-01-01
    相关资源
    最近更新 更多