【问题标题】:Spring Mongo reactive Handle Database Error on Save保存时 Spring Mongo 反应式处理数据库错误
【发布时间】:2018-03-31 11:36:39
【问题描述】:

当我将 Reactive Mongo 与 Spring webflux 一起使用时,有人可以帮助我如何处理数据库异常...

我有一个 仓库类

public interface UserRepository  extends ReactiveMongoRepository<User,String> 
{
   public Mono<User> findByUserName(String userName);
}

UserHandler中的Handler方法

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 索引:用户名重复键:{:“asoni11”} 在 com.mongodb.async.client.MongoCollectionImpl$8.onResult(MongoCollectionImpl.java:638) ~[mongodb-driver-async-3.4.3.jar:na] ...省略了163个常用框架

【问题讨论】:

    标签: project-reactor spring-webflux


    【解决方案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()));
    

    【讨论】:

    • 谢谢还有一个问题是这个代码抛出 DuplicateKeyException 因为我对用户名字段有一个唯一的约束,但错误不会作为响应返回,所以我如何向用户发送自定义错误消息跨度>
    • 谢谢,但是在 Postman 中,当我调用 API 时,我仍然收到 INTERNAL SERVER Error 并且没有消息
    • 您能否编辑您的问题以反映这一点?堆栈跟踪和错误响应可能很有用
    • 完成控制台中的错误是由:com.mongodb.MongoWriteException:E11000 重复键错误集合:letsbuy.users 索引:用户名重复键:{:“asoni11”}
    • 那么你应该在 onErrorResume 方法中使用 MongoWriteException
    猜你喜欢
    • 2015-01-24
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 2020-12-08
    • 2015-12-13
    • 1970-01-01
    • 2019-07-17
    相关资源
    最近更新 更多