5 回答

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)普遍的需求/模式)。

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)行了討論,更新的代碼如下。

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);

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));
}

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));
}
添加回答
舉報(bào)