簡體   English   中英

如何在 Spring web flux 中編寫 Update API?

[英]How to write Update API in Spring web flux?

我對 Spring Web Flux 反應式編程還很陌生。 所以這有點令人困惑。

我正在用 spring web flux 編寫更新 API。 傳遞的請求體 tp update 方法是請求的 Mono。 所以我的問題是如何獲取請求正文並執行? . 請檢查以下代碼中的注釋行。

public Mono<User> updateUser(String userId, Mono<UserRequest> user){

    return userRepository.findById(userId)
        .switchIfEmpty(Mono.error(new NotFoundException("User not found")))
        .flatMap(foundUser -> {
            // How to get passed user object from Mono<UserRequest>
            modelMapper.map(source, foundUser);
            return Mono.just(userRepository.save(foundUser))
        })
}

謝謝你。

您可以添加.zipWith(user, (foundUser, user) ->... (或返回Tuple的簡單.zipWith(user) )。

樣本:

    @Test
    void x1() {
        Mono<String> m1 = Mono.just("S1");
        Mono<String> m2 = Mono.just("S2");

        m1
            .switchIfEmpty(Mono.error(new NotFoundException("User not found")))
            .zipWith(m2, (s1, s2) -> s1.concat(s2)) // can be simplified to 'String::concat'
            .as(StepVerifier::create)
            .assertNext(s -> assertThat(s)
                .isEqualTo("S1S2")
            )
            .verifyComplete();
    }

    @Test
    void x2() {
        Mono<String> m1 = Mono.just("S1");
        Mono<String> m2 = Mono.error(new RuntimeException("some-error"));

        m1
            .switchIfEmpty(Mono.error(new NotFoundException("User not found")))
            .zipWith(m2, String::concat)
            .as(StepVerifier::create)
            .expectErrorSatisfies(throwable -> assertThat(throwable)
                .isInstanceOf(RuntimeException.class)
                .hasMessage("some-error")
            )
            .verify();
    }

    @Test
    void x3() {
        Mono<String> m1 = Mono.error(new RuntimeException("some-error"));
        Mono<String> m2 = Mono.just("S2");

        m1
            .switchIfEmpty(Mono.error(new NotFoundException("User not found")))
            .zipWith(m2, String::concat)
            .as(StepVerifier::create)
            .expectErrorSatisfies(throwable -> assertThat(throwable)
                .isInstanceOf(RuntimeException.class)
                .hasMessage("some-error")
            )
            .verify();
    }

    @Test
    void x4() {
        Mono<String> m1 = Mono.empty();
        Mono<String> m2 = Mono.just("S2");

        m1
            .switchIfEmpty(Mono.error(new NotFoundException("User not found")))
            .zipWith(m2, String::concat)
            .as(StepVerifier::create)
            .expectErrorSatisfies(throwable -> assertThat(throwable)
                .isInstanceOf(NotFoundException.class)
                .hasMessage("User not found")
            )
            .verify();
    }

順便說一句,反應堆有一個非常方便的文檔: https ://projectreactor.io/docs/core/release/reference/#which-operator

我也想知道為什么你傳遞Mono<UserRequest> user - 它來自哪里以及為什么你不能使用普通UserRequest user

此外,您的存儲庫很可疑 - 為什么findById返回一個反應對象,而save卻沒有? 它看起來像一個阻塞調用,因此你失去了 webflux/reactor 的好處。

// 如何從 Mono 獲取傳遞的用戶對象

從那個 Mono 開始(存儲庫調用無論如何都是非反應性操作):

public Mono<User> updateUser(String userId, Mono<UserRequest> user){
    return user.map(request -> ...);
}

閱讀:一旦 UserRequest 對象可用,請執行...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM