Spring Webflux:根据需求消耗单声道或助焊剂

时间:2019-05-19 10:44:56

标签: spring-webflux project-reactor

我有一个处理对象(例如产品)的资源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没有被调用。

注意:我使用订阅,但不起作用。

谢谢。

1 个答案:

答案 0 :(得分:1)

我刚接触Webflux时遇到过类似的问题。简而言之,您不能在请求正文上调用订阅,并且异步返回响应,因为订阅可能没有足够的时间来读取正文。您可以看到类似问题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());
}