Working with spring webflux reactive repositories results in nested Mono Object

public interface ApplicationDataRepository extends ReactiveCrudRepository<ApplicationData, Long> {
}

Working with spring webflux reactive repositories results in nested Mono Object.

applicationDataRepository.findById(100L).map(o -> {
    o.setName("changed name");
    return applicationDataRepository.save(o);
})

The above three lines of code results in Mono<Mono<ApplicationData>>. How can I transform this into Mono<ApplicationData> or avoid ending up in this situation ?

Answer

It’s not WebFlux matter. It is a Reactive Streams programming model and its API implementation via Project Reactor. Please, make yourself familiar with it first of all: https://projectreactor.io/

What you need is a flatMap operator of the Mono:

/**
 * Transform the item emitted by this {@link Mono} asynchronously, returning the
 * value emitted by another {@link Mono} (possibly changing the value type).
 *
 * <p>
 * <img class="marble" src="doc-files/marbles/flatMapForMono.svg" alt="">
 *
 * @param transformer the function to dynamically bind a new {@link Mono}
 * @param <R> the result type bound
 *
 * @return a new {@link Mono} with an asynchronously mapped value.
 */
public final <R> Mono<R> flatMap(Function<? super T, ? extends Mono<? extends R>>
        transformer) {

https://projectreactor.io/docs/core/release/reference/#which.values

The WebFlux is really just about a Web: https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html#spring-webflux

The ReactiveCrudRepository is a part of Spring Data project: https://docs.spring.io/spring-data/commons/docs/2.4.6/reference/html/#repositories

What I mean that it is wrong to call everything “webflux” since the subject is a bit broader than just Web.

Leave a Reply

Your email address will not be published. Required fields are marked *