如何使用弹簧反应 webflux 中的单声道和助焊剂使用 DTO 制作新的单声道

Posted

技术标签:

【中文标题】如何使用弹簧反应 webflux 中的单声道和助焊剂使用 DTO 制作新的单声道【英文标题】:How to make new mono with DTO from mono and flux in spring reactive webflux 【发布时间】:2022-01-22 04:43:24 【问题描述】:

在这里我尝试从数据库中调用并从不同的单声道和通量组合成新的单声道。

public Mono<ListMovieWithKomenDTO> fetchMovieAndKomen(Integer movieId)
            Mono<Movie> movie = findById(movieId).subscribeOn(Schedulers.elastic());
            Flux<MovieKomen> movieKomen = getKomenByMovieId(movieId).subscribeOn(Schedulers.elastic());
            return Mono.zip(movie, movieKomen.collectList(), movieMovieKomenDTOBiFunction);
        
private BiFunction<Movie, List<MovieKomen>, ListMovieWithKomenDTO> movieMovieKomenDTOBiFunction = (x1, x2) -> ListMovieWithKomenDTO.builder()
                // .age(x1.getAge())
                .id(x1.getId())
                .name(x1.getName())
                .status(x1.getStatus())
                .detail(x1.getDetail())
                .url(x1.getUrl())
                .movieKomen(x2).build();

在这里,我为标题(如电影)和详细信息(如电影评论)两次调用 db 以将它们分开。在我检索两个不同的数据后,我想加入基于通量数据和单声道的新单声道数据。为了使它们成为一个数据,我使 DTO 将电影表和评论表放在一起,但它失败了。我认为 mono.zip 中的错误是为了将数据放入一个新的单声道中。

这里是调试控制台的错误

java.lang.IllegalArgumentException: Cannot encode parameter of type org.springframework.r2dbc.core.Parameter
    at io.r2dbc.postgresql.ExtendedQueryPostgresqlStatement.bind(ExtendedQueryPostgresqlStatement.java:89) ~[r2dbc-postgresql-0.8.10.RELEASE.jar:0.8.10.RELEASE]

谢谢

【问题讨论】:

您可以先删除两个subscribeOn,它们都不需要,如果您需要它们,则只需要一个,因为如文档中所述,subscribeOn 将影响整个链。请阅读说明如何以及何时使用 subscribeOn 的参考资料 当我删除其中一个时它仍然会出错。先生有什么建议吗?谢谢 【参考方案1】:

问题出在我使用的存储库中

public interface MovieKomenRepository  extends ReactiveCrudRepository<MovieKomen,Integer> 
    @Query("select * from m_movie_komen where m_movie_id = $1")
    Flux<MovieKomen> findByMovieId(int movie_id);

在上面的示例中,我使用 $1 作为查询中的参数。但是当我像底部一样更改我的代码时。它就像一个魅力。

public interface MovieKomenRepository  extends ReactiveCrudRepository<MovieKomen,Integer> 
    @Query("select * from m_movie_komen where m_movie_id = :movie")
    Flux<MovieKomen> findByMovieId(@Param("movie") int movie_id);

所以如果有人想使用我的服务代码很好,但在存储库中要小心。我们不应该使用 '$1' 而不是 ':movie'。所以问题不在服务或单声道/通量中。但在我的存储库中

谢谢。

【讨论】:

以上是关于如何使用弹簧反应 webflux 中的单声道和助焊剂使用 DTO 制作新的单声道的主要内容,如果未能解决你的问题,请参考以下文章

如何使用嵌入在 C++ 中的单声道编译 C# 代码?

Spring webflux:从请求中消耗单声道或通量

使用 webflux 在另一个中设置一个单声道

如何将我的单声道程序添加到启动中?

如何使用 WebFlux 设置重定向

如何组合两个或多个参数化的 Monos Webflux 最佳实践