Kombinieren von Monos in Spring Boot WebFlux

Ich habe zwei Methoden, die jeweils ein Objekt Mono<Foo> und Mono<Bar> zurückgeben. Ausgehend davon möchte ich eine Methode schreiben, die Mono<Foo> zurückgibt aber, falls ein Flag in dem Foo Objekt gesetzt ist, die zweite Methode für Mono<Bar> aufruft und das Ergebnis Bar nutzt um die eine Eigenschaft des ersten Objektes Foo zu ändern.

Oder einfacher ausgedrückt: Wie kombiniert man diese beiden Methodenaufrufe, aber eben nur, falls eine bestimmte Eigenschaft in dem Response der ersten Methode vorhanden ist?

In Pseudo-Code sollte das in etwa so aussehen:

public Mono<Foo> getFoo() {
    Mono<Foo> foo = methodeFoo()
    if (fooHasFlag(foo)) {
     Mono<Bar> bar = methodeBar()
     return combine(foo, bar)
    } else {
        return foo;
    }
}

Das ganze wird in einem Spring Boot Controller verwendet.

Noch keine Stimmen abgegeben
Noch keine Kommentare
  • 19 Feb. 2023

    Das geht sehr elegant mit dem flatMap Operator:

    public Mono<Foo> getCombinedFoo() {
        // Die Methode für Mono<Foo> aufrufen
        Mono<Foo> fooMono = getFoo();
    
        // Verketten mit der zweite Methode für Mono<Bar> mit dem flatMap() Operator
        Mono<Foo> combinedMono = fooMono.flatMap(foo -> {
    
            // Flag prüfen mit der vordefinierten "fooHasFlag" 
            // und bei Bedarf Methode für Mono<Bar> aufrufen
            if (fooHasFlag(foo)) {
                Mono<Bar> barMono = getBar();
                return barMono.map(bar -> {
                    // die beiden Objekte über die vordefinierte "combine" Methode kombinieren
                    return combine(foo, bar);
                });
            } else {
                // Ist das Flag nicht gesetzt, so können wir Mono<Foo> direkt zurückgeben
                return Mono.just(foo);
            }
        });
    
        return combinedMono;
    }
    

    Hier ist der Unterschied zwischen flatMap und map wichtig:

    • map()-Operator ändert nur die Ausgabe eines Publishers
    • Der flatMap()-Operator wird verwendet, um den von einem Publisher ausgegebenen Wert in einen anderen Publisher umzuwandeln und dann die Sequenz von Publishern in einen einzigen Datenstrom von Werten zu reduzieren.
    Noch keine Stimmen abgegeben
    Noch keine Kommentare