在 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()
}
最后,将生成的 Mono
s 映射到响应 DTO:
Mono.zip(getFootballclubs(), getCountries())
.map(tuple2 -> Response.builder().footballClubs(tuple2.getT1()).countries(tuple2.getT2()).build())
请注意,如果我们的俱乐部和国家/地区数量有限,这是一个有效的解决方案。
从内部有两个通量(数组)的控制器对象 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()
}
最后,将生成的 Mono
s 映射到响应 DTO:
Mono.zip(getFootballclubs(), getCountries())
.map(tuple2 -> Response.builder().footballClubs(tuple2.getT1()).countries(tuple2.getT2()).build())
请注意,如果我们的俱乐部和国家/地区数量有限,这是一个有效的解决方案。