Пружинная операция бокового потока, возвращающая Mono <Void> - PullRequest
0 голосов
/ 11 июня 2018
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<RefreshToken>) и returns Mono<Void>.Тогда я хочу zip, когда вернусь Mono<RefreshToken>.

Я достиг этого только с помощью then для замены возвращаемого значения Mono<Void>:

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

Итак, есть ли более четкие способы достижения этой цели?Какая альтернатива для zip при этом?

1 Ответ

0 голосов
/ 11 июня 2018

Если вам не нужно возвращаемое значение метода 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 в свой репозиторий;Вы удалили бы токен из хранилища данных и вернули его в одном запросе к базе данных.

...