如果来自 webflux mono 的条件在 kotlin 中为真,则仅将用户存储在 mongo db 中

Storing user only in mongo db if condition from webflux mono is true in kotlin

我有以下问题。仅当用户的电子邮件不存在时,我想通过反应性 spring 数据存储库将用户保存到 mongo 数据库中。

@Component("userService")
class UserService(private val repository: UserRepository){

        fun checkIfEMailExists(email: String): Mono<Boolean> {
                return repository.findByEMail(email).hasElement()
        }

        fun create(user: User): Mono<User> {
               //not sure how to do this bit here
               this.checkIfEMailExists(user.email)
               .filter{ it -> it == true}
               .map{repository.save(user)}  
        }  

}

所以,基本上我不确定如何处理布尔值的 Mono 以仅当它的值为 true 时才做某事(否则抛出异常)

首先,您的 MongoDB 存储库应该是反应式存储库,并且 return 一个 Mono<User>Flux<User> 用于那种签名:

public interface UserRepository extends ReactiveMongoRepository<User, String> {

    Mono<User> findByEmail(String email);
}

然后您可以像这样将反应式类型与其他运算符链接起来:

@Service
public class UserService {

    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public Mono<User> create(User user) {
        return this.userRepository.findByEmail(user.getEmail())
                .flatMap(existingUser -> Mono.error(new UserAlreadyPresentException(existingUser.getEmail())))
                .then(this.userRepository.save(user));
    }

    class UserAlreadyPresentException extends RuntimeException {

        public UserAlreadyPresentException(String email) {
            super("User already present with email " + email);
        }
    }
}