【发布时间】:2020-06-16 06:18:27
【问题描述】:
我是响应式编程和 Spring Webflux 的新手
我有一个从 Redis 获取某个键的方法,如果该键为 null 或不等于指定的字符串,我想抛出异常,但不会调用嵌套的 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 方法中创建另一个发布者,因为 spring 只是订阅了最外部的发布者,内部的发布者不会被触发我已经更新了我的代码,但它仍然不起作用。
【问题讨论】:
-
你在某个时候打电话给
subscribe ()? -
@daniu Spring 自动调用它
-
在返回的
Mono?怎么样? -
doOnNext 只是回调,说明当上面的 Mono 成功完成时要做什么,.. 通常我们记录一些东西或更新一些值,但它不用于返回一些东西或抛出异常.. 所以总结一下, 你在 doOnNext 中的异常被吞掉 如果你想抛出异常然后做不同的事情,即在这里检查:stackoverflow.com/questions/53595420/…
标签: java spring-boot reactive-programming spring-webflux project-reactor