问题描述
从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
。根据应用程序的预期行为,您可以调查defaultIfEmpty
或switchIfEmpty
运算符来处理这种情况 - 存在错误。您可以让错误流抛出管道并由WebFlux处理,也可以直接与
onError*
运算符进行处理。
如果您是Reactor的新手,您可以随时在链中的任何位置添加log()
运算符(作为常规运算符),并在日志中看到确切发生的情况。