【问题标题】:Spring web-flux side operation returning Mono<Void>Spring web-flux 端操作返回 Mono<Void>
【发布时间】:2018-11-20 13:06:54
【问题描述】:
public interface RefreshTokenReactiveRepository extends ReactiveCrudRepository<RefreshToken, Long> {

Mono<RefreshToken> findByValue(String value);

}

下一个方法在 TokenService 类中。

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&lt;RefreshToken&gt;)和returns Mono&lt;Void&gt;。然后我要 zipWhen 返回Mono&lt;RefreshToken&gt;。

我仅通过使用then 替换返回的Mono&lt;Void&gt; 值来实现这一点:

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

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

【问题讨论】:

    标签: spring-webflux project-reactor


    【解决方案1】:

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

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

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

    【讨论】:

    • 布莱恩,感谢您的回答!但是 'then' 的无参数变体返回 Mono,因此不会调用 zipWhen 中的“组合器”,因此 zipWhen 的输出将是 Mono。
    • 你能更新你的问题来分解一下吗?当我们没有您正在使用的自定义方法的签名时,很难用它来推理。
    • 好的,我会的。
    • 我已经更新了我的答案 - 感谢您编辑您的问题!
    猜你喜欢
    • 2021-05-08
    • 2017-12-13
    • 2019-10-20
    • 2020-08-28
    • 1970-01-01
    • 2020-03-20
    • 2021-09-30
    • 1970-01-01
    • 2020-10-28
    相关资源
    最近更新 更多