【问题标题】:How to extract data from a Mono object in Spring Webflux without blocking?如何在不阻塞的情况下从 Spring Webflux 中的 Mono 对象中提取数据?
【发布时间】:2021-01-28 22:10:58
【问题描述】:

我正在使用 Postman 向我的 Spring 应用程序发送一个 POST 请求。该请求的 JSON 正文如下所示:

{
        "documents": [
            {
                "id": "1",
                "text": "Piece of text 1",
                "lang": "en"
            },
            {
                "id": "2",
                "text": "Piece of text 2",
                "lang": "en"
            }
        ],
        "domain": "hr",
        "text_key": "text"
    }

我设置了一个方法来处理这些 POST 请求,并且我需要能够从请求正文中提取上述 JSON 数据而不会阻塞。我现在的方法看起来像这样:

public void requestBody(ServerRequest request) {


      Mono<String> bodyData = request.bodyToMono(String.class);

      System.out.println("\nsubscribing to the Mono.....");

      bodyData.subscribeOn(Schedulers.newParallel("requestBody")).subscribe(value -> {
        log.debug(String.format("%n value consumed: %s" ,value));
      });

}

但是,这无济于事。我尝试查看Spring Reactive get body JSONObject using ServerRequest 中的答案 和 Getting String body from Spring serverrequest 但无济于事。请帮忙。


Update #1

感谢https://stackoverflow.com/users/1189885/chrylis-cautiouslyoptimistic

根据您的回答,这就是我正在尝试的:

    request.bodyToMono(String.class).map(
        (String rqBody) -> {
          setRequestBody(rqBody);
          return ServerResponse.status(HttpStatus.CREATED).contentType(APPLICATION_JSON).body(rqBody, Object.class);
        }
      );


setRequestBody() 正在设置一个全局字符串变量作为请求正文。像这样:


  public void setRequestBody (String rqBody){
    System.out.println("\nset request body called with: " + rqBody);
    request_body=rqBody;
  }

但是,全局 request_body 变量仍然为空。


Update #2

根据您的最新评论,这就是我正在尝试做的事情:



    RedissonClient redisson = Redisson.create();

    RBucket<Object> bucket = redisson.getBucket("requestKey");

      request.bodyToMono(String.class).doOnNext(
        (String rqBody) -> {
          bucket.set(rqBody);
        }
      );

当我进入 Redis-cli 并尝试get requestKey 时,它给了我nil

【问题讨论】:

    标签: java spring spring-boot reactive-programming spring-webflux


    【解决方案1】:

    不能;这就是反应模型的全部含义。相反,您通常应该使用map(通过应用函数来修改值)或doOnNext(采取一些行动但不返回结果)之类的操作。

    如果使用响应式执行模型,例如 Spring WebFlux,您可以直接从控制器方法中返回 Mono&lt;Whatever&gt;,然后 Spring 会为您“提取”数据。

    【讨论】:

    • 你能看看我的后续问题吗,我已经把它作为这个问题的另一个答案发布了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 2019-09-09
    相关资源
    最近更新 更多