project-reactor - Spring Mongo 响应式(Reactive)处理数据库保存错误

标签 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 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/

相关文章:

java - 使用 Spring WebFlux 的 webclient 在 Mono 上有条件地重复或重试

java - 如何使用 Spring reactive 通过增量进度更新逐一处理每个产品?

java - 在 Spring Webflux 中返回 201 具有特定主体的创建状态

java - 如何使用 Spring 的 WebClient 将 Flux<String> 作为 JSON 数组进行 HTTP POST?

spring - react 堆映射 Mono<Boolean> 到 Mono<Void>

kotlin - Reactor-加载分页API的所有页面

java - 如何自定义SpringWebFlux WebClient xml+rss JAXB反序列化?

spring-webflux - 从 Mono.fromCallable 返回 Mono.empty()

java - 响应式(Reactive)存储库