保存时Spring Mongo反应句柄数据库错误

时间:2017-10-19 12:22:18

标签: project-reactor spring-webflux

当我使用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个常用帧

1 个答案:

答案 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()));