首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mono对象而不是Mono<myPojo>

Mono对象而不是Mono<myPojo>
EN

Stack Overflow用户
提问于 2022-10-18 18:07:36
回答 1查看 36关注 0票数 0

好的,所以我有了下面的方法,但是我试图避免使用.block(),所以尝试实现Mono,但是得到了错误Required type: List<Mono<CatalogItem>> Provided:Mono<Object>

原码

代码语言:javascript
复制
@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的尝试

代码语言:javascript
复制
@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()));
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-18 19:04:29

将java8StreamAPI与反应堆发布程序结合起来并不是最佳的解决方案,因为这会降低代码的可读性,使它们的工作方式不同。您可以查看here获得更多详细信息,以防userRating.getUserRating()返回分级列表,您可以尝试使用此代码。

代码语言:javascript
复制
  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);
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74115575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档