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

问题描述

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

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

并且我想使用studentId(student.getStudentId())将新值保存在其他表中

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

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