使用 WebFlux 从 Mono<Entity> 对象收集 int 值

Collecting int value from the Mono<Entity> object using WebFlux

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

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

并且我想使用 studentId (student.getStudentId()) 在不同的 table

中保存一个新值
StudentSubject ss;
ss.setStudentId(student.getStudentId());
studentsubjectRepository.save(ss);

最好的方法是什么?

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

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

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

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

这里可能会发生几件事:

  • 有一个学生有那个 id,一个主题是用那个信息创建的,并且是 returned,只要有东西订阅这个 Mono。订阅部分通常发生在 Spring WebFlux 中,因此您只需要 return 来自您的控制器方法的 Mono
  • 没有学生使用该 ID,因此第一个存储库将 return Mono.empty()。在这种情况下,您的 flatMap 运算符将不会被调用,并且实际上 returned 是一个空的发布者;没有创建 StudentSubject。根据您应用的预期行为,您可以查看 defaultIfEmptyswitchIfEmpty 运算符来处理这种情况
  • 出现错误。可以让错误流抛出管道由WebFlux处理,也可以直接用onError*个operators处理

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