我有一个网络服务,可以返回学生和注册的课程详细信息。
{
"name": "student-name",
"classes": [
{
"className": "reactor-101",
"day": "Tuesday"
},
{
"className": "reactor-102",
"day": "Friday"
}
]
}
此课程的DTO如下:
public class Student {
private String name;
private Flux<StudentClass> classes;
@Data
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
public static class StudentClass {
private String className;
private String day;
}
}
获取学生的主要REST控制器逻辑如下:
Flux<StudentClass> studentClassFlux = studentClassRepository.getStudentClass(studentName);
return Mono.just(new Student(studentName, studentClassFlux));
问题是,我在进行REST调用后得到以下输出:
{
"name": "student-name",
"classes": {
"prefetch": 32,
"scanAvailable": true
}
}
我可以通过阻塞磁通请求来完成所需的输出,然后将输出转换为列表。
List<StudentClass> studentClassList = studentClassRepository.getStudentClass(studentName)..toStream().collect(Collectors.toList());
return Mono.just(new Student(studentName, studentClassList)); // Change the Student#classes from flux to list
我是反应式编程的新手。 使用Flux&amp; amp;的正确方法是什么? Mono在这里获得所需的输出?
答案 0 :(得分:1)
当彼此包装时,反应类型并不意味着序列化。
在这种特殊情况下,您可能希望Student
对象包含List<StudentClass>
。你可以这样做:
public Mono<Student> findStudent(String studentName) {
return studentClassRepository
.getStudentClass(studentName)
.collectList()
.map(studentClasses -> new Student(studentName, studentClasses));
}
答案 1 :(得分:0)
我认为,如果你的结果中确实需要一个Flux,你可能想要分解API,以便你有单独的方法来检索实体。 一个用于学生属性,另一个用于他们的课程。学生GET方法可以是Mono,而类会返回Flux。