Spring webflux: использовать моно или поток из запроса - PullRequest
0 голосов
/ 19 мая 2019

У меня есть API ресурса, который обрабатывает объект (например, Product).

Я использую 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 Ответ

1 голос
/ 19 мая 2019

У меня была похожая проблема, когда я был новичком в Webflux. Короче говоря, вы не можете вызвать подписку на теле запроса и асинхронно возвращать ответ, потому что подписка может не иметь достаточно времени для чтения тела. Вы можете увидеть полное объяснение подобной проблемы здесь .

Чтобы ваш код работал, вы должны связать ответ с вашим логическим потоком. Это должно быть что-то вроде следующего:

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());
}
...