当我使用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重复键错误集合:letsbuy.users index:username dup key:{:&#34; asoni11&#34; } 在com.mongodb.async.client.MongoCollectionImpl $ 8.onResult(MongoCollectionImpl.java:638)〜[mongodb-driver-async-3.4.3.jar:na] ...省略了163个常用帧
答案 0 :(得分:1)
这有点违反直觉,但在这种情况下你需要做类似的事情:
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()));