当前位置: 首页 > 知识库问答 >
问题:

doOnNext()不会被称为Spring Webflux

殷安顺
2023-03-14

我是反应编程的新手,也是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只订阅最外部的发布者,内部的发布者将不会被触发,我已经更新了代码,但它仍然不起作用。

共有1个答案

董同
2023-03-14

我猜您说这个“不起作用”是因为您无法观察数据库中保存的customer,即使您对第二个(最里面的)DoonNext进行了(正确的)更改之后?

第三个DoonNext有问题:CustomerRepository.Save(customer)是一个NO-OP,假设CustomerRepository是一个反应存储库,因为(懒惰的)Mono既没有附加到主序列,也没有订阅。

只需将doOnNext替换为FlatMap(并将您对最内部doOnNext的更改保留为SwitchIfEmpty),即可使其成为Spring将订阅的反应链的一部分。

 类似资料:
  • 我找不到合适的解释。我可以找到JVM被称为虚拟机的原因,但无法找到jre不被称为虚拟机的原因。请帮忙。

  • 我有一个服务器-客户端应用程序不工作。这是代码:ChatServerHandler ChatServerInitializer 只是要提一下,其他一切都很好,信息只是没有收到。试图使用println在channelRead打印某些内容将不起作用。所以我知道它不会被打电话。另外,对不起,如果我不应该在这里发布整个代码,但我只是没有想法。

  • 我已经在Windows 10中为Windows Installer安装了Anaconda 2019.03。当在Powershell上键入以 文件。 < li >如metod米多2所示卸载并安装,也没有任何改变。 < li >打开的Anaconda Powershell提示符除了“conda”无法识别之外,还出现以下错误: 实际上,路径 在我查看时并不存在。 列出的其他信息: 我已经在我的电脑上安装

  • 正如标题所说,我根本无法让Quartz.net工作。我从NuGet获得了最新版本的Quartz.net(2.2.1)、Common.Logging(2.1.2)、Common.Logging.NLog(2.0.0)和NLog(2.1.0)。触发器没有被触发,而且石英绝对没有记录任何东西。我猜我搞砸了配置。 我的应用程序配置: 有一个作业和一个触发器与之相关: 调度程序将启动,作业和触发器将正确添加

  • 我正在尝试在未来的预定时间生成警报。下面是代码 主要活动。Java语言 警报eceiever.java content\u main。xml 舱单 我试图在一分钟后生成警报,但不幸的是什么都没有发生。我在这里做错了什么?此外,即使在手机重启/关机然后打开后,我如何确保我的日程安排仍然有效?

  • 我是spring webflux和reactor的新手,我希望在发生某些特定异常时有一个回退机制,根据我的研究,onErrorResume方法可以做到这一点,但它不会被调用,我得到500个内部服务器错误,而不是触发回退并阻止此错误。 注意:我使用Spring网络流量,这意味着它在Reactor项目的正常行为中做了一些改变 这是堆栈跟踪