好的,所以我有下面的方法,但我試圖擺脫使用 .block(),所以試圖實作 Mono 但得到錯誤Required type: List<Mono<CatalogItem>> Provided:Mono<Object>
原始代碼
@GetMapping("/user/{userId}")
public List<CatalogItem> getUserMoviesRating(@PathVariable String userId) {
UserRating ratings = webClientBuilder.build()
.get()
.uri("http://localhost:8083/ratingsdata/users/" userId)
.retrieve()
.bodyToMono(UserRating.class)
.block();
assert ratings != null;
return ratings.getUserRating().stream().map(rating -> {
Movies movie = webClientBuilder.build()
.get()
.uri("http://localhost:8082/movies/" rating.getMovieId())
.retrieve()
.bodyToMono(Movies.class)
.block();
assert movie != null;
return new CatalogItem(movie.getName(), movie.getDesc(), rating.getRating());
}).collect(Collectors.toList());
}}
我嘗試以非阻塞方式使用 Mono 進行重構
@GetMapping("/user/{userId}")
public List <Mono<CatalogItem>> getUserMoviesRating(@PathVariable String userId) {
Mono<UserRating> ratings = webClientBuilder.build()
.get()
.uri("http://localhost:8083/ratingsdata/users/" userId)
.retrieve()
.bodyToMono(UserRating.class);
return ratings.map(userRating -> userRating.getUserRating().stream().map(rating -> {
Mono<Movies> movies = webClientBuilder.build()
.get()
.uri("http://localhost:8082/movies/" rating.getMovieId())
.retrieve()
.bodyToMono(Movies.class);
return movies.map(m -> new CatalogItem(m.getName(), m.getDesc(), rating.getRating()));
}).collect(Collectors.toList()));
}
uj5u.com熱心網友回復:
將 java 8 Stream API 與 Reactor 發布者結合起來并不是最佳解決方案,因為這會降低代碼的可讀性并且它們的作業方式不同。您可以在這里查看更多詳細資訊如果userRating.getUserRating()回傳評級串列,您可以嘗試此代碼。
public Mono <List<CatalogItem>> getUserMoviesRating(@PathVariable String userId) {
Mono<UserRating> ratings = webClientBuilder.build()
.get()
.uri("http://localhost:8083/ratingsdata/users/" userId)
.retrieve()
.bodyToMono(UserRating.class);
return ratings.flatMapMany(userRating -> Flux.fromIterable(userRating.getUserRating()))
.flatMap(rating->this.getMovie(rating.getMovieId()))
.map(m -> new CatalogItem(m.getName(), m.getDesc(), rating.getRating()))
.collectList();
}
private Mono<Movies> getMovie(String movieId){
return webClientBuilder.build()
.get()
.uri("http://localhost:8082/movies/" movieId)
.retrieve()
.bodyToMono(Movies.class);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/518069.html
