Spring webflux 弹簧腹板流量侧操作返回单声道<;无效>;

Spring webflux 弹簧腹板流量侧操作返回单声道<;无效>;,spring-webflux,project-reactor,Spring Webflux,Project Reactor,那么,有没有更明确的方法来实现这一目标?在这种情况下,zipWhen的替代方法是什么?如果不需要deleteById方法的返回值,则不需要使用zip;在这里,您只想从存储库中删除以前的令牌(如果它在存储库中),然后返回它。像这样的方法应该会奏效: refreshTokenReactiveRepository.deleteById(previousRefreshToken.getId()) .then(Mono.just("")) public Mon

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

如果不需要
deleteById
方法的返回值,则不需要使用
zip
;在这里,您只想从存储库中删除以前的令牌(如果它在存储库中),然后返回它。像这样的方法应该会奏效:

refreshTokenReactiveRepository.deleteById(previousRefreshToken.getId())
                    .then(Mono.just(""))  
public Mono-ExchangerRefreshToken(字符串refreshTokenValue){
返回refreshTokenReactiveRepository.findByValue(refreshTokenValue)
.flatMap(以前的刷新令牌->
反应性沉积
.deleteById(previousRefreshToken.getId())
.thenReturn(previousRefreshToken.getAccount())
)
.flatMap(this::generateTokenPair);
}

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

Brian,谢谢您的回答!但是'then'的arg变量没有返回Mono,因此zipWhen中的“combinator”将不会被调用,因此zipWhen的输出将是Mono。您能更新一下您的问题以分解一些东西吗?当我们没有您正在使用的自定义方法的签名时,很难进行推理。好的,我会的。我已经更新了我的答案-感谢您编辑您的问题!
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())
                    .then(Mono.just(""))  
public Mono<TokenPair> exchangeRefreshToken(String refreshTokenValue) {
    return refreshTokenReactiveRepository.findByValue(refreshTokenValue)
            .flatMap(previousRefreshToken ->
                refreshTokenReactiveRepository
                        .deleteById(previousRefreshToken.getId())
                        .thenReturn(previousRefreshToken.getAccount())
            )
            .flatMap(this::generateTokenPair);
}