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