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