Spring 如果kotlin中webflux mono的条件为真,则仅在mongo db中存储用户
我有以下问题。我只想在用户的电子邮件不存在的情况下,通过反应式spring数据存储库将用户保存到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
@组件(“用户服务”)
类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(字符串电子邮件){
超级(“已发送电子邮件的用户”+电子邮件);
}
}
}