在 DTO 响应中使用 Flux

Use Flux in a DTO response

从内部有两个通量(数组)的控制器对象 return 的最佳方法是什么?

我有两个反应性存储库。一个与足球俱乐部有关,另一个与国家有关。我想 return 喜欢:

public record InitData(Flux<FootballClub> footballclubs, Flux<Country> countries){}

所以我可以 return 通过 .block 列出而不是通量,但这不是个好主意。如何订阅控制器中的两个存储库和 return 两个数组?

您不能在一个 DTO 中 return 多个 Flux 实例。 Flux 需要在某处订阅才能有用。假设您有以下响应 DTO:

public class Response  {

  private List<String> footballClubs;
  private List<Integer> countries;

}

您可以使用 .collectList() 方法将存储库发出的所有实体收集到 List:

private Mono<List<String>> getFootballclubs() {
  return footballclubsRepository.select().collectList();
}

private Mono<List<Integer>> getCountries() {
  return countriesRepository.select().collectList()
}

最后,将生成的 Monos 映射到响应 DTO:

Mono.zip(getFootballclubs(), getCountries())
      .map(tuple2 -> Response.builder().footballClubs(tuple2.getT1()).countries(tuple2.getT2()).build())

请注意,如果我们的俱乐部和国家/地区数量有限,这是一个有效的解决方案。