如何在不阻塞的情况下从 Spring Webflux 中的 Mono 对象中提取数据?
Posted
技术标签:
【中文标题】如何在不阻塞的情况下从 Spring Webflux 中的 Mono 对象中提取数据?【英文标题】:How to extract data from a Mono object in Spring Webflux without blocking? 【发布时间】: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://***.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
【问题讨论】:
【参考方案1】:你不能;这就是反应模型的全部含义。相反,您通常应该使用map
(通过应用函数来修改值)或doOnNext
(采取一些行动但不返回结果)之类的操作。
如果使用响应式执行模型,例如 Spring WebFlux,您可以直接从控制器方法中返回 Mono<Whatever>
,然后 Spring 会为您“提取”数据。
【讨论】:
你能看看我的后续问题吗,我已经把它作为这个问题的另一个答案发布了。以上是关于如何在不阻塞的情况下从 Spring Webflux 中的 Mono 对象中提取数据?的主要内容,如果未能解决你的问题,请参考以下文章
在不阻塞 dom 的情况下从后端渲染 ($compile) html 到视图中
Spring,如何在不使用附加转换器的情况下从字符串返回XML响应?
如何在不使用 sudo 的情况下从终端窗口关闭 Internet 连接?