首页 > 解决方案 > 从 Mono 中收集 int 值使用 WebFlux 的对象

问题描述

从 Mono 对象收集值的正确方法是什么?我有一个名为 Student 的实体,它同时具有用户和学生 ID 值。

Mono<Student> student = studentRepository.findStudentByUserid(id);

我想使用 studentId ( student.getStudentId()) 在不同的表中保存一个新值

StudentSubject ss;
ss.setStudentId(student.getStudentId());
studentsubjectRepository.save(ss);

最好的方法是什么?

标签: javarepositoryspring-webflux

解决方案


你的问题缺乏一些细节,所以我将从这一点假设一些事情。

假设您的应用正在使用以下代码:

Mono<StudentSubject> studentSubject = studentRepository.findStudentByUserid(id)
    .flatMap(student -> {
        StudentSubject subject = new StudentSubject();
        subject.setStudentId(student.getStudentId());
        return studentsubjectRepository.save(subject);
    });

使用flatMap运算符允许您以反应方式链接调用。

这里可能会发生几件事:

  • 有一个具有该 id 的学生,使用该信息创建一个主题并返回,只要有订阅 this Mono。订阅部分通常发生在 Spring WebFlux 中,因此您只需Mono从控制器方法中返回它。
  • 没有具有该 ID 的学生,因此第一个存储库将返回Mono.empty(). 在这种情况下,您的flatMap操作员不会被调用,并且会有效地返回一个空的发布者;没有StudentSubject创建。根据您的应用程序的预期行为,您可以调查defaultIfEmptyswitchIfEmpty运营商来处理这种情况
  • 有错误。您可以让错误流抛出管道并由 WebFlux 处理,也可以直接与onError*操作员处理。

如果您是 Reactor 新手,您可以随时log()在链中的任意位置添加操作员(作为常规操作员),您将在日志中看到确切发生的情况。


推荐阅读