如何在另一个具有循环依赖性的单声道中使用单声道
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()
}
我有一个 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()
}