如果来自 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);
}
}
}
我有以下问题。仅当用户的电子邮件不存在时,我想通过反应性 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);
}
}
}