如何在另一个具有循环依赖性的单声道中使用单声道

How to use a mono in another mono that have circular dependency

我有一个 spring 引导响应式应用程序。如果用户不存在,我想在其中实现创建用户。像这样:

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 流需要知道这是否已经存在 returns 一个单声道。

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

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

问题是我使用了 filter() 而不是我应该使用的是评估异步 Monos 的 filterWhen()

我做了什么:

fun create(userDTO: Mono<UserDTO>): Mono<Void> {
    return userDTO.filterWhen { innerUserDTO ->
        userRepository.existsByNameIgnoreCase(innerUserDTO.username).map { !it }
    }
            .flatMap { createNewUser(it) }
            .switchIfEmpty(userAlreadyExist())
            .then()
}