gpt4 book ai didi

java - doOnNext() 不会被调用 Spring Webflux

转载 作者:行者123 更新时间:2023-12-04 10:28:44 26 4
gpt4 key购买 nike

我是响应式(Reactive)编程的新手,也是 Spring Webflux 的新手我有一个方法可以从 Redis 获取一些键,如果这个键为 null 或不等于指定的字符串,我想抛出一个异常,但是嵌套的 donOnNext 方法不会被调用并且 customerRepository.save(customer) 在必须抛出异常并中断链时被触发。有人可以向我解释 react 器 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 只是订阅最外部的发布者,内部发布者不会被触发我已经更新了我的代码,但它仍然不起作用。

最佳答案

我猜你是说这“不起作用”,因为你无法在数据库中观察到保存的 customer,即使在你对第二个(最里面的)doOnNext?

第三个 doOnNext 是有问题的:customerRepository.save(customer) 是一个 NO-OP 假设 customerRepository 是一个 react 性存储库,因为(懒惰)Mono 既不附加到主序列也不订阅。

只需将 doOnNext 替换为 flatMap(并使用 switchIfEmpty 保留对最内层 doOnNext 的更改),使其成为Spring 将订阅的 react 链。

关于java - doOnNext() 不会被调用 Spring Webflux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60514490/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com