Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java doOnNext()元';我没有被称为春季网络流量_Java_Spring Boot_Reactive Programming_Spring Webflux_Project Reactor - Fatal编程技术网

Java doOnNext()元';我没有被称为春季网络流量

Java doOnNext()元';我没有被称为春季网络流量,java,spring-boot,reactive-programming,spring-webflux,project-reactor,Java,Spring Boot,Reactive Programming,Spring Webflux,Project Reactor,我是反应式编程的新手,也是SpringWebFlux的新手 我有一个从Redis获取某个键的方法,如果该键为null或不等于指定的字符串,我想抛出一个异常,但嵌套的donOnNext方法不会被调用,并且customerRepository.save(customer)在必须抛出异常并断开链时被触发。有人能给我解释一下在我的例子中反应堆API是如何工作的吗 这是我的方法: @Override public Mono<RegistrationVerificationResDTO> ver

我是反应式编程的新手,也是SpringWebFlux的新手 我有一个从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));
}
@覆盖
公共Mono verifyCustomerAndGenerateToken(Mono verifyOtpReqDTO){
返回verifyOtpReqDTO
.doOnNext(验证到->反应器操作
.opsForValue()
.get(RedisDictionary.OTP_KEY+verifyDTO.getPhoneNumber())
.filter(otp->otp.equalsIgnoreCase(verifyDTO.getOtp()))
.switchIfEmpty(Mono.error(禁止异常::新建)))
.map(verifyDTO->customerRepository.findById(verifyDTO.getId())
.orelsetrow(()->new NotFoundException(“未找到客户”))
.doOnNext(客户->{
customer.setVerified(true);
customerRepository.save(客户);
})
.map(客户->新注册验证resdto().setAccessToken(“accessToken”)
.setRefreshToken(“refreshToken”)
.setCustomer(customer));
}
更新:
我意识到,如果我们在doOnNext方法中创建另一个发布服务器,因为spring只订阅了最外部的发布服务器,内部的发布服务器不会被触发,我已经更新了代码,但仍然无法工作。

我猜您是说这“不起作用”,因为即使在(正确)您对第二个(最里面的)
doOnNext
所做的更改

第三个
doOnNext
有问题:
customerRepository.save(customer)
是一个不可操作的存储库,假设
customerRepository
是一个反应存储库,因为(lazy)
Mono
既没有附加到主序列,也没有订阅


只需将
doOnNext
替换为
flatMap
(并使用
switchiftempty
保留对最内层doOnNext的更改),使其成为Spring将订阅的反应链的一部分。

您正在调用
subscribe()
在某个时刻?@daniu Spring在返回的
Mono
上自动调用它?如何?@daniu doOnNext只是一个回调,说明当Mono成功完成时该怎么做,…通常我们会记录一些东西或更新一些值,但它不用于返回某些东西或抛出异常..总之,doOnNext中的异常是sw如果你想抛出异常,那么就做不同的事情,即在这里检查:不,你的猜测是不正确的。问题是客户保存在数据库中,但是我的期望在这之前被抛出了异常,考虑我的问题中的“嵌套”字。但是谢谢你在第三段中的建议,我会试试看,我会让你更新。我的另一个问题是关于你提到的这句话:让它成为spring将订阅的反应链的一部分。根据我的知识,spring会自动订阅该链,doonnext和flatmap之间没有区别。你能用这句话澄清你的意思吗?han和在
doOnNext
flatMap
中创建Mono/Flux:Spring会订阅控制器返回的外部Mono或Flux,但该订阅仅传播到链中的链接发布者。在
doOnNext
中生成发布者不会使其成为链中的链接,而会返回来自
flatMap
的出版商有。我在问题描述中更新了我的代码。你能看一下吗?