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

Spring 如果kotlin中webflux mono的条件为真,则仅在mongo db中存储用户,spring,mongodb,kotlin,spring-data-mongodb,spring-webflux,Spring,Mongodb,Kotlin,Spring Data Mongodb,Spring Webflux,我有以下问题。我只想在用户的电子邮件不存在的情况下,通过反应式spring数据存储库将用户保存到mongo db中 @组件(“用户服务”) 类UserService(专用val存储库:UserRepository){ 有趣的checkIfEMailExists(电子邮件:字符串):Mono{ 返回repository.findByEMail(email.hasElement()) } 乐趣创建(用户:用户):Mono{ //我不知道该怎么做 此.checkIfEMailExists(user.e

我有以下问题。我只想在用户的电子邮件不存在的情况下,通过反应式spring数据存储库将用户保存到mongo db中

@组件(“用户服务”)
类UserService(专用val存储库:UserRepository){
有趣的checkIfEMailExists(电子邮件:字符串):Mono{
返回repository.findByEMail(email.hasElement())
}
乐趣创建(用户:用户):Mono{
//我不知道该怎么做
此.checkIfEMailExists(user.email)
.filter{it->it==true}
.map{repository.save(用户)}
}  
}

因此,基本上,我不确定如何处理布尔值的Mono,只有当它的值为true时(否则会引发异常)

首先,您的MongoDB存储库应该是一个反应式存储库,并为此类签名返回一个
Mono
Flux

public interface UserRepository extends ReactiveMongoRepository<User, String> {

    Mono<User> findByEmail(String email);
}
public interface UserRepository扩展了ReactiveMongoRepository{
Mono findByEmail(字符串电子邮件);
}
然后,您可以将该反应类型与其他操作符链接,如下所示:

@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);
        }
    }
}
@服务
公共类用户服务{
私有最终用户存储库用户存储库;
公共用户服务(用户存储库用户存储库){
this.userRepository=userRepository;
}
公共单声道创建(用户){
返回此.userRepository.findByEmail(user.getEmail())
.flatMap(existingUser->Mono.error(新用户ReadyPresentException(existingUser.getEmail()))
。然后(this.userRepository.save(user));
}
类UserAlreadyPresentException扩展了RuntimeException{
公共用户ReadyPresentException(字符串电子邮件){
超级(“已发送电子邮件的用户”+电子邮件);
}
}
}