Исключение в Mono.fromCallable не приводит к ошибке - PullRequest
1 голос
/ 23 мая 2019

Я пробую kotlin в домашнем проекте с Spring webflux и проектным реактором.Я пытаюсь сделать блокирующий вызов базы данных 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())

Если бы я попросил идентификатор, который не существует в моей базе данных, я бы ожидал 404 назад.Вместо этого я получаю 500 обратно из запроса и IllegalArgumentException прямо в мою консоль в IDE.Если кто-нибудь может сказать мне, почему это так, или иметь какую-либо информацию по этому поводу, это будет с благодарностью!

1 Ответ

1 голос
/ 24 мая 2019

doOnError добавляет поведение, если моно завершается с ошибкой.Другими словами, это добавляет побочный эффект, но не меняет поток.Заменить doOnError на onErrorResume.onErrorResume это именно то, что вам нужно, он подписывается на запасного издателя, если возникает какая-либо ошибка.

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
...