当前位置: 首页 > 知识库问答 >
问题:

如何在Spring Webflux中从单一对象中提取数据而不阻塞?

乜胜泫
2023-03-14

我正在使用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));
      });

}

然而,这没有任何作用。我尝试使用ServerRequest查看Spring中的答案,并从Spring ServerRequest中获取字符串体,但没有成功。请帮忙。

更新#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;
  }

但是,全局请求_body变量仍然为空。

更新#2

根据你最近的评论,这就是我想做的:



    RedissonClient redisson = Redisson.create();

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

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

当我进入Redis-cli并尝试获取请求密钥时,它会给我零代码

共有1个答案

郗丰
2023-03-14

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

如果使用反应式执行模型,如Spring WebFlux,则直接返回Mono

 类似资料:
  • 我目前有两个表格:劳动力和员工。劳动力表是所有提交简历加入公司的潜在员工的集合。Employees表是Workforce表中实际雇用的人员的集合。 环境:1。Eclipse 2。Java(J2EE)3。Maven 4。Spring5。JPA(JpaRepository) 为简洁起见,我将坚持使用与数据提取和数据插入另一个表有关的文件。 由于两个表的相似性,Workforce表中的许多字段将与Emp

  • 我有一个对象列表(文件夹)。该列表中的每个对象A都有一个对象B(合作伙伴)列表,对象B也有一个对象C(人员)列表。对象C包含一个属性代码,我想用它来使用Java8进行过滤。 我试过下面的代码,但它似乎不工作: 你们知道我如何使用FlatMap从

  • 我正在使用一个spring boot api,它可以接收非常大的对象,并尝试将其保存在MongoDB数据库中。因此,程序有时会抛出下一个错误: 我读到MongoDB只允许16MB以下大小的对象,这对我的系统非常不方便,因为一个对象可以很容易地超过这个差距。为了解决这个问题,我读过GridFS,一种允许超过16MB文件差距的技术。 现在,我试图在系统中实现GridFS,但我只看到了使用文件保存在数据

  • 下面是演示类 我有一个演示实例: 对于新的,我需要从Demo了解字段,因为我需要一种通用的方法来获得任何具有基本字段/简单字段的类的对象数组

  • 我试图从ECB货币XML对象中提取交换值。这里有http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml 我可以毫无问题地加载对象,然后打印出所有数据。然而,我无法从该对象获取特定数据。 这是print_r的输出 SimpleXMLElement对象([Cube]= 例如,我如何从美元中获得汇率的值?阅读此线程后,我如何访问数组/对象

  • 我得到错误:“com.google.gson.jsonSyntaxException:java.lang.IllegalStateException:Expected BEGIN_OBJECT但是BEGIN_ARRAY位于第1行column 283 path$.items.Promended[0].images” 我请求帮助从json对象提取数据。 我只需要删除类'images',并将'urls'