Spring web-flux 端操作返回 Mono<Void>

Spring web-flux side operation returning Mono<Void>

public interface RefreshTokenReactiveRepository extends ReactiveCrudRepository<RefreshToken, Long> {

Mono<RefreshToken> findByValue(String value);

}

下一个方法在 TokenService 中 class。

public Mono<TokenPair> exchangeRefreshToken(String refreshTokenValue) {
  return refreshTokenReactiveRepository.findByValue(refreshTokenValue)
    .zipWhen(
        previousRefreshToken ->
            refreshTokenReactiveRepository.deleteById(previousRefreshToken.getId())
                .then(Mono.just("")),
        (previousRefreshToken, deleteResult) -> previousRefreshToken
    )
    .map(RefreshToken::getAccount)
    .flatMap(this::generateTokenPair);
 }

我想执行 refreshTokenReactiveRepository.deleteById(previousRefreshToken.getId()) 副操作,这取决于之前的单声道结果​​ (Mono<RefreshToken>) 和 returns Mono<Void>。那我要zipWhen return Mono<RefreshToken>

我只是通过使用 then 替换 returning Mono<Void> 值才实现的:

refreshTokenReactiveRepository.deleteById(previousRefreshToken.getId())
                    .then(Mono.just(""))  

那么,有没有更明确的方法来实现这个目标呢?在这种情况下,zipWhen 的替代方案是什么?

如果不需要deleteById方法的return值,则不需要使用zip;在这里,您只需要从存储库中删除以前的令牌(如果存在),然后 returning 它。这样的事情应该有效:

public Mono<TokenPair> exchangeRefreshToken(String refreshTokenValue) {
    return refreshTokenReactiveRepository.findByValue(refreshTokenValue)
            .flatMap(previousRefreshToken ->
                refreshTokenReactiveRepository
                        .deleteById(previousRefreshToken.getId())
                        .thenReturn(previousRefreshToken.getAccount())
            )
            .flatMap(this::generateTokenPair);
}

您可以通过在存储库中添加 deleteByValue 方法来简化此过程;您将删除数据存储中的令牌并在单个数据库查询中取回它。