Я новичок 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, потому что весна просто подпишется на самого внешнего издателя, внутренний не сработает. Я обновил свой код, но он все еще не работает.