java - 从 Mono 中收集 int 值使用 WebFlux 的对象
问题描述
从 Mono 对象收集值的正确方法是什么?我有一个名为 Student 的实体,它同时具有用户和学生 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 的学生,使用该信息创建一个主题并返回,只要有订阅 this
Mono
。订阅部分通常发生在 Spring WebFlux 中,因此您只需Mono
从控制器方法中返回它。 - 没有具有该 ID 的学生,因此第一个存储库将返回
Mono.empty()
. 在这种情况下,您的flatMap
操作员不会被调用,并且会有效地返回一个空的发布者;没有StudentSubject
创建。根据您的应用程序的预期行为,您可以调查defaultIfEmpty
或switchIfEmpty
运营商来处理这种情况 - 有错误。您可以让错误流抛出管道并由 WebFlux 处理,也可以直接与
onError*
操作员处理。
如果您是 Reactor 新手,您可以随时log()
在链中的任意位置添加操作员(作为常规操作员),您将在日志中看到确切发生的情况。
推荐阅读
- python - 在 Scrapy 中,如何使用 JSON 加载项来填充新字段?
- spring-boot - Spring Data Rest 不能做集成测试?
- c++ - GCC - 如果定义了函数,如何发出警告或错误
- angular - 带有 selectionModel 的 mat-checkbox - 选中的属性不起作用
- java - 就地交换逻辑在快速排序中不起作用,但使用临时变量进行交换有效。为什么?
- haskell - Haskell 标志模式
- terraform - 切换到新工作区时,Terraform 尝试再次创建 S3 后端
- python - python for in循环n次
- arduino - 是否可以将带有 AND 比较的 if 语句放入语句或 for 循环中
- arrays - 为什么 Flutter 在访问列表元素时会报错?