首页 > 解决方案 > 如何在另一个具有循环依赖的单声道中使用单声道

问题描述

我有一个 Spring Boot 反应式应用程序。如果用户不存在,我想在哪里实现创建用户。像这样:

fun userAlreadyExist() = Mono.error<UserDTO>(UsernameAlreadyExistException())

fun create(userDTO: Mono<UserDTO>): Mono<Void> {
    return userDTO.filter { userRepository.existsByNameIgnoreCase(it.username).block() == false }
            .switchIfEmpty(userAlreadyExist())
            .flatMap { createNewUser(it).then() }

我真正不喜欢的是我需要.block()在过滤器内部使用。有一个更好的方法吗?

最大的问题是两者都有循环依赖,因为UserRepository需要知道用户名和 userDTO 流需要知道这是否已经存在,这会返回一个单声道。

标签: spring-bootkotlinreactive-programmingspring-webfluxproject-reactor

解决方案


这里的逻辑看起来有点奇怪——你可能可以这样做:

fun create(userDTO: Mono<UserDTO>): Mono<Void> {
    return userDTO.flatMap {
               userRepository.findByNameIgnoreCase(it.username)
                             .flatMap(user -> userAlreadyExist())
                             .switchIfEmpty(createNewUser(it)) 
           }.then()

推荐阅读