当前位置: 首页 > 知识库问答 >
问题:

Mono对象而不是Mono

曹浩淼
2023-03-14

好吧,所以我有下面的方法,但我试图摆脱使用。块(),因此尝试实现Mono,但得到错误< code >所需的类型:List

原始代码

@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()));
}

共有1个答案

顾乐池
2023-03-14

将 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);
  }
 类似资料:
  • 我想从Flux/Mono中获取对象。我使用 我会这样做: 我有错误: 为什么?有什么不同的方法来获取对象? 在反应式编程中,如何做到:在RequestBody中,您有UserDto。 如果不创建用户,请检查数据库中是否存在电子邮件。

  • 问题内容: 只是试图在视图中显示我通过ajax从控制器获取的数组,但它显示的是[object Object],[object Object]而不是array。请在下面检查我的js文件: 问题答案: 使用转换到。 试试这个: 我认为,这对您有帮助-

  • 我有以下代码: 现在我使我的存储库成为反应性的。我的问题是如何使缓存存储现在单声道和通量。 我遇到了以下Mono和Flux缓存,但这只是为了查找,因为我也是反应式编程的初学者。

  • 问题内容: 我正在一个JavaScript项目上,只是想知道为什么对象实例不继承和其他方法,而不必调用超类(superobject?)方法。 我看过了MDN文档,实际上有“非标准”属性方法。 但这些已被弃用。为什么要转向方法? 在我看来,类似的东西比更好。对于其他一些Object方法,我也会说同样的话。 问题答案: 这是为了避免发生冲突-通常情况下,对象的问题不具有所需值的属性。 JS中的对象通常

  • 问题内容: 我一直在尝试更新一个名为libpynexmo的小型Python库以与Python 3一起使用。 我一直坚持这个功能: 遇到这个问题时,json会回应: 我在一些地方读到,应该为您传递带有附件的对象(在这种情况下为对象),但是它不适用于对象。 我不知道下一步该怎么做,但是由于我的整个1500行脚本是新转换为Python 3的,所以我不想回到2.7。 问题答案: 我最近写了一个小功能来发送

  • 我最近开始使用reactive,并创建了一个使用reactive流的简单应用程序。 我有以下代码,我通过empID获得一名员工。只有当boolean设置为时,我才需要向API提供有关员工的额外详细信息。如果设置为false,我必须在返回employee对象之前将额外的详细信息设置为null。现在我正在使用流上的一个块来实现这一点。有没有可能在没有阻塞的情况下执行此操作,以便我的方法可以返回Mono