第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何僅當(dāng) Mono 為空時(shí)才執(zhí)行操作,如果非空則拋出錯(cuò)誤

如何僅當(dāng) Mono 為空時(shí)才執(zhí)行操作,如果非空則拋出錯(cuò)誤

慕村225694 2023-09-06 16:07:23
我正在嘗試將項(xiàng)目轉(zhuǎn)換為使用 Spring WebFlux,但在一些基本業(yè)務(wù)邏輯工作方面遇到了問題。我有一個(gè)負(fù)責(zé)檢索/持久記錄的存儲(chǔ)庫層和一個(gè)負(fù)責(zé)應(yīng)用程序業(yè)務(wù)規(guī)則的服務(wù)層。我想要做的(在服務(wù))層是檢查給定用戶名的用戶是否已經(jīng)存在。如果是這樣,我想用錯(cuò)誤來響應(yīng)。如果沒有,我想允許插入發(fā)生。我在存儲(chǔ)庫層調(diào)用一個(gè)方法,該方法將通過用戶名查找用戶,如果找不到,它將返回一個(gè)空的 Mono。這按預(yù)期工作;但是,我嘗試了 flatMap 和(defaultIfEmpty 和 swithIfEmpty)的各種組合,但無法編譯/構(gòu)建它。    public Mono<User> insertUser(User user) {        return userRepository.findByUsername(user.username())            .flatMap(__ -> Mono.error(new DuplicateResourceException("User already exists with username [" + user.username() + "]")))            .switchIfEmpty(userRepository.insertUser(user));    }我收到的錯(cuò)誤是Mono<Object> cannot be converted to Mono<User>,所以swithIfEmpty似乎沒有反映適當(dāng)?shù)念愋?,并且轉(zhuǎn)換似乎也不起作用。
查看完整描述

5 回答

?
慕姐8265434

TA貢獻(xiàn)1813條經(jīng)驗(yàn) 獲得超2個(gè)贊

經(jīng)過額外的測(cè)試,并考慮了其他開發(fā)人員的反饋,我得出了以下解決方案:


    public Mono<User> insertUser(User user) {

        return userRepository.findByUsername(user.username())

            .flatMap(__ -> Mono.error(new DuplicateResourceException("User already exists with username [" + user.username() + "]")))

            .switchIfEmpty(Mono.defer(() -> userRepository.insertUser(user)))

            .cast(User.class);

    }

正如托馬斯所說,編譯器變得混亂。我的假設(shè)是因?yàn)閒latMap返回一個(gè)帶有錯(cuò)誤的 Mono,并且switchIfEmpty返回一個(gè)帶有用戶的 Mono,因此它恢復(fù)為帶有對(duì)象的 Mono(因此.cast需要額外的運(yùn)算符來編譯它)。


另一個(gè)添加是Mono.defer在switchMap. 否則,switchIfEmpty總是會(huì)開火。


我仍然愿意接受其他建議/替代方案(因?yàn)檫@似乎是一個(gè)相當(dāng)普遍的需求/模式)。


查看完整回答
反對(duì) 回復(fù) 2023-09-06
?
慕仙森

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個(gè)贊

我正在使用具有類型參數(shù)的抽象類,E因此我無法使用.cast(E.class). 我們的解決方案是

private Mono<E> checkIfStatementExists(E statement) {
    return this.statementService.getByStatementRequestId(statement.getStatementRequestId())
            .flatMap(sr -> Mono.<E>error(new ValidationException("Statement already exists for this request!")))
            .switchIfEmpty(Mono.just(statement));
}

我想下周我需要和同事們討論一下這個(gè)問題。

編輯。我們與同事進(jìn)行了討論,更新的代碼如下。


查看完整回答
反對(duì) 回復(fù) 2023-09-06
?
梵蒂岡之花

TA貢獻(xiàn)1900條經(jīng)驗(yàn) 獲得超5個(gè)贊

為什么您會(huì)收到此編譯器錯(cuò)誤是由于以下原因。


flatmap獲取您已完成的內(nèi)容Mono并嘗試將其轉(zhuǎn)換為它可以推斷的任何類型。Mono.error包含一個(gè)類型,并且該類型是Object。


一種方法是將您的邏輯移至平面圖中。


// This is just example code using strings instead of repos

public Mono<String> insertUser(String user) {

    return Mono.just(user)

            // Here we map/convert instead based on logic

            .flatMap(__ -> {

                if (__.isEmpty())

                    return Mono.error(new IllegalArgumentException("User already exists with username [" + user + "]"));

                return Mono.just(user);

            }).switchIfEmpty(Mono.just(user));

}

switchIfEmpty恕我直言,不太適合做出邏輯決策。文檔指出


如果此單聲道在沒有數(shù)據(jù)的情況下完成,則回退到替代 Mono


如果我們沒有得到任何東西,這更像是一種后備措施,這樣我們就可以保持?jǐn)?shù)據(jù)流的繼續(xù)。


你也可以


Mono.empty().doOnNext(o -> {

        throw new IllegalArgumentException("User already exists with username [" + o + "]");

    }).switchIfEmpty(Mono.just("hello")).subscribe(System.out::println);


查看完整回答
反對(duì) 回復(fù) 2023-09-06
?
DIEA

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超2個(gè)贊

遇到了同樣的問題,最后做了下面的事情,


請(qǐng)注意:這不需要類型轉(zhuǎn)換并且適用于兩種情況,即


如果數(shù)據(jù)庫中已存在元素,則拋出錯(cuò)誤。


插入元素,否則返回 Mono。


  public Mono<UserDTO> insertUser(User user) {

     return this.userRepository.findByUsername(user.getUsername())

             .flatMap(foundUser-> null != foundUser ? Mono

                     .error(new UserAlreadyExistsException(ExceptionsConstants.USER_ALREADY_EXISTS_EXCEPTION))

                     : Mono.just(user))

             .switchIfEmpty(this.userRepository.save(user))

             .map(userCreated -> copyUtils.createUserDTO(userCreated));

  }


查看完整回答
反對(duì) 回復(fù) 2023-09-06
?
至尊寶的傳說

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超10個(gè)贊

可以通過使用一些 Java 通用魔法以 的形式Mono::cast指定 的類型來解決這個(gè)問題,而不是使用 來更改 Mono 的類型。這還有一個(gè)額外的優(yōu)點(diǎn),即您不需要通過向具有 null 處理的方法添加邏輯來更改 Mono 管道的流程,但實(shí)際上永遠(yuǎn)不會(huì)接收 null。Mono.errorMono.<User>error(...)flatMap


這看起來如下:


public Mono<User> insertUser(User user) {

    return userRepository.findByUsername(user.username())

        .flatMap(__ -> Mono.<User>error(new DuplicateResourceException("User already exists with username [" + user.username() + "]")))

        .switchIfEmpty(userRepository.insertUser(user));

}


查看完整回答
反對(duì) 回復(fù) 2023-09-06
  • 5 回答
  • 0 關(guān)注
  • 346 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)