当我将 Reactive Mongo 与 Spring webflux 结合使用时,有人可以帮助我如何处理数据库异常 ...
我有一个 存储库类
public interface UserRepository extends ReactiveMongoRepository<User,String>
{
public Mono<User> findByUserName(String userName);
}
UserHandler 中的处理方法
public Mono<ServerResponse> saveUser(ServerRequest request) {
Mono<User> user = request.bodyToMono(User.class).map(userObj -> {
userObj.setPassword(passwordEncoder.encode(userObj.getPassword()));
return userObj;
});
return
ServerResponse.ok().body(this.userRepository.insert(user),User.class);
}
我已经在用户名上定义了一个唯一键,所以当异常抛出时我想返回一个有意义的消息来使用我如何使用 OnErrorMap 返回一个带有消息的服务器响应。
我在控制台中收到以下错误,但没有向用户返回错误
at sun.nio.ch.Invoker$2.run(Invoker.java:218) ~[na:1.8.0_60]
at sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:112) ~[na:1.8.0_60]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.8.0_60]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.8.0_60]
at java.lang.Thread.run(Thread.java:745) ~[na:1.8.0_60]
引起:com.mongodb.MongoWriteException: E11000 duplicate key error collection: letsbuy.users index: username dup key: { : "asoni11"} 在 com.mongodb.async.client.MongoCollectionImpl$8.onResult(MongoCollectionImpl.java:638)~[mongodb-driver-async-3.4.3.jar:na] ... 省略了 163 个常用框架
最佳答案
这有点违反直觉,但在那种情况下,您需要执行以下操作:
Mono<User> savedUser = request.bodyToMono(User.class).map(userObj -> {
userObj.setPassword(passwordEncoder.encode(userObj.getPassword()));
return userObj;
})
.flatMap(user -> this.userRepository.insert(user));
return savedUser
.flatMap(u -> ServerResponse.ok().syncBody(u))
.onErrorResume(DuplicateKeyException.class,
t -> ServerResponse.status(HttpStatus.BAD_REQUEST).syncBody(t.getMessage()));
关于project-reactor - Spring Mongo 响应式(Reactive)处理数据库保存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46829763/