如何在具有循环依赖关系的另一个Mono中使用Mono

时间:2018-09-29 08:30:53

标签: spring-boot kotlin reactive-programming spring-webflux project-reactor

我有一个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流需要知道是否已经存在(这会返回单声道)。

2 个答案:

答案 0 :(得分:0)

这里的逻辑看起来有些奇怪-您可能可以执行以下操作:

objectID

答案 1 :(得分:0)

问题是我使用filterWhen()代替了fun create(userDTO: Mono<UserDTO>): Mono<Void> { return userDTO.filterWhen { innerUserDTO -> userRepository.existsByNameIgnoreCase(innerUserDTO.username).map { !it } } .flatMap { createNewUser(it) } .switchIfEmpty(userAlreadyExist()) .then() } 来评估异步Monos。

我做了什么:

{{1}}