我有一个网络服务,可返回学生和已注册的类(class)详细信息。

{
  "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 Controller 逻辑如下:
Flux<StudentClass> studentClassFlux = studentClassRepository.getStudentClass(studentName);

return Mono.just(new Student(studentName, studentClassFlux));

问题是,在进行REST调用后,我得到以下输出:
{
  "name": "student-name",
  "classes": {
    "prefetch": 32,
    "scanAvailable": true
  }
}

我可以通过阻止磁通量请求完成来实现所需的输出,然后将输出转换为list。
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

我是响应式(Reactive)编程的新手。
在这里使用助焊剂和单声道以获得所需输出的正确方法是什么?

最佳答案

react 性类型彼此包装在一起时,并不意味着要序列化。
在这种情况下,您可能希望Student对象包含List<StudentClass>。您可以这样实现:

public Mono<Student> findStudent(String studentName) {

    return studentClassRepository
             .getStudentClass(studentName)
             .collectList()
             .map(studentClasses -> new Student(studentName, studentClasses));
}

关于project-reactor - 如何正确地将助焊剂包裹在Mono对象中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46227337/

10-10 16:47