我是反应式编程和 Spring Webflux 的新手,我有一种方法可以从 Redis 获取一些密钥,如果该密钥为 null 或不等于指定的字符串,我想抛出异常,但嵌套的 donOnNext 方法不会被调用并被customerRepository.save(customer)触发,而必须抛出异常并打破链条。有人可以向我解释一下 Reactor 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));
}
Run Code Online (Sandbox Code Playgroud)
更新:我意识到如果我们在 doOnNext 方法中创建另一个发布者,因为 spring 仅订阅最外层的发布者,内部发布者不会被触发我已经更新了我的代码,但它仍然不起作用。
java reactive-programming spring-boot project-reactor spring-webflux