doOnNext () не будет вызываться Spring Webflux - PullRequest
1 голос
/ 03 марта 2020

Я новичок ie в реактивном программировании, а также в Spring Webflux. У меня есть метод для получения некоторого ключа от Redis, и если этот ключ равен нулю или не равен указанной строке, я хочу вызвать исключение, но вложенный метод donOnNext не будет вызван и customerRepository.save(customer) будет запущен, в то время как исключение должно быть сгенерировано и разорвать цепочку. Может кто-нибудь объяснить мне, как API реактора ведет себя в моем случае?

Это мой метод:

@Override
public Mono<RegistrationVerificationResDTO> verifyCustomerAndGenerateToken(Mono<VerifyOtpReqDTO> verifyOtpReqDTO) {
    return verifyOtpReqDTO
            .doOnNext(verifyDTO -> reactiveRedisOperations
                    .opsForValue()
                    .get(RedisDictionary.OTP_KEY + verifyDTO.getPhoneNumber())
                    .filter(otp -> otp.equalsIgnoreCase(verifyDTO.getOtp()))
                    .switchIfEmpty(Mono.error(ForbiddenException::new)))
            .map(verifyDTO -> customerRepository.findById(verifyDTO.getId())
                    .orElseThrow(() -> new NotFoundException("Customer not found")))
            .doOnNext(customer -> {
                customer.setVerified(true);
                customerRepository.save(customer);
            })
            .map(customer -> new RegistrationVerificationResDTO().setAccessToken("accessToken")
                    .setRefreshToken("refreshToken")
                    .setCustomer(customer));
}

ОБНОВЛЕНИЕ: Я понял, если мы создадим другого издателя внутри метода doOnNext, потому что весна просто подпишется на самого внешнего издателя, внутренний не сработает. Я обновил свой код, но он все еще не работает.

1 Ответ

2 голосов
/ 06 марта 2020

Я предполагаю, что вы говорите, что это "не работает", потому что вы не можете наблюдать за сохраненным customer в БД, даже после (правильных) изменений, которые вы внесли во вторую (самую внутреннюю) doOnNext?

Третий doOnNext проблематичен c: customerRepository.save(customer) - это NO-OP, предполагая, customerRepository - реактивный репозиторий, потому что (ленивый) Mono не присоединен ни к главная последовательность или подписка.

Просто замените это doOnNext на flatMap (и сохраните ваши изменения самого внутреннего doOnNext на switchIfEmpty), чтобы сделать его частью реактивной цепочки, на которую подпишется Spring к.

...