gpt4 book ai didi

kotlin - Mono.fromCallable 中的异常不会导致错误

转载 作者:行者123 更新时间:2023-12-02 13:36:17 25 4
gpt4 key购买 nike

我正在使用 Spring webflux 和项目 react 器在家庭项目中试用 kotlin。我正在尝试对 H2 数据库进行阻塞调用,因此我按照建议使用 fromCallable 方法。根据我的理解和经验,fromCallable 应该包装任何遇到的异常,然后可以使用 doOnError 处理这些异常,但相反,错误直接显示在控制台中。

fun updateUser(req: ServerRequest): Mono<ServerResponse> =
req.bodyToMono(UserDto::class.java)
.flatMap { userDto -> updateUser(userDto) }
.flatMap { user -> ServerResponse.ok().syncBody(user!!) }
.doOnError { ServerResponse.notFound().build() }

fun updateUser(userDto: UserDto): Mono<User?> =
Mono.fromCallable {
val id = userDto.id.toLong()
userRepository.findByIdOrNull(id) ?:
throw IllegalArgumentException("No user found")
}.subscribeOn(Schedulers.elastic())

如果我请求一个我的数据库中不存在的 ID,我会得到 404 返回。相反,我从请求和 IllegalArgumentException 中直接返回 500 到我的 IDE 控制台。如果有人能告诉我这是为什么,或者有任何关于此的信息,我们将不胜感激!

最佳答案

doOnError 在单声道因错误终止时添加行为。换句话说,它增加了副作用但不会改变流。将 doOnError 替换为 onErrorResumeonErrorResume 它正是您所需要的,如果发生任何错误,它会订阅一个回退发布者。

fun updateUser(req: ServerRequest): Mono<ServerResponse> =
req.bodyToMono(UserDto::class.java)
.flatMap { userDto -> updateUser(userDto) }
.flatMap { user -> ServerResponse.ok().syncBody(user!!) }
.onErrorResume { ServerResponse.notFound().build() } // fallback publisher
.doOnError { println("Failed to perform an update: $it") } // side effect

关于kotlin - Mono.fromCallable 中的异常不会导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56280485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com