【问题标题】:How to correctly wrap a Flux inside a Mono object如何正确地将 Flux 包装在 Mono 对象中
【发布时间】:2017-09-14 20:00:45
【问题描述】:

我有一个返回学生和注册班级详细信息的网络服务。

{
  "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 和 Mono 以获得所需输出的正确方法是什么?

【问题讨论】:

    标签: project-reactor spring-webflux reactive-streams


    【解决方案1】:

    反应性类型在相互包装时并不意味着要序列化。 在这种特殊情况下,您可能希望您的Student 对象包含List&lt;StudentClass&gt;。你可以这样实现:

    public Mono<Student> findStudent(String studentName) {
    
        return studentClassRepository
                 .getStudentClass(studentName)
                 .collectList()
                 .map(studentClasses -> new Student(studentName, studentClasses));
    }
    

    【讨论】:

    • 这行得通,前提是您没有大量真正需要流式传输的子项。在很多情况下,您希望返回 Flux 加上一点元数据,使用这个例子,如果响应应该是 { "metadata": {...}, students: [...] } 和一点点元数据和大量学生。
    【解决方案2】:

    我认为,如果您确实需要在结果中使用 Flux,您可能希望分解 API,以便拥有单独的方法来检索实体。 一个用于学生财产,另一个用于他们的班级。学生的 GET 方法可以是 Mono,而类会返回 Flux。

    【讨论】:

      猜你喜欢
      • 2018-12-07
      • 2014-03-14
      • 2021-08-02
      • 2021-09-30
      • 2020-01-28
      • 2020-01-04
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      相关资源
      最近更新 更多