Spring webflux:从请求中消耗单声道或通量
Posted
技术标签:
【中文标题】Spring webflux:从请求中消耗单声道或通量【英文标题】:Spring webflux : consume mono or flux from request 【发布时间】:2019-10-06 00:01:48 【问题描述】:我有一个处理对象(例如产品)的资源 API。
我使用 PUT 来更新数据库中的这个对象。
我只想将一个空的 Mono 返回给用户。
这是我的代码:
public Mono<ServerResponse> updateProduct(ServerRequest request)
Mono<Product> productReceived = request.bodyToMono(Product.class);
Mono<Product> result = productReceived.flatMap(item ->
doSomeThing(item);
System.out.println("Called or not called!!");
return Mono.just(productService.product);
).subscribe();
return ok()
.contentType(APPLICATION_JSON)
.body(Mono.empty(), Product.class);
问题是我的方法doSomeThing()
和println
没有被调用。
注意:我使用 subscribe 但不起作用。
谢谢。
【问题讨论】:
【参考方案1】:当我刚接触 Webflux 时,我遇到了类似的问题。简而言之,您不能在请求正文上调用 subscribe 并异步返回响应,因为订阅可能没有足够的时间来读取正文。你可以看到一个类似问题的完整解释here。
要使您的代码正常工作,您应该将响应与逻辑流结合起来。它应该类似于以下内容:
public Mono<ServerResponse> updateProduct(ServerRequest request)
return request
.bodyToMono(Product.class)
.flatMap(item ->
doSomeThing(item);
System.out.println("Called or not called!!");
return Mono.just(productService.product);
)
.then(ServerResponse.ok().build());
【讨论】:
以上是关于Spring webflux:从请求中消耗单声道或通量的主要内容,如果未能解决你的问题,请参考以下文章
如何使用弹簧反应 webflux 中的单声道和助焊剂使用 DTO 制作新的单声道