Spring Webflux WebExceptionHandler не запускается OptimisticLockingFailure - PullRequest
0 голосов
/ 10 января 2020

У меня есть GlobalExceptionHandler для перехвата всех сгенерированных исключений и возврата правильного кода возврата. Все работает, кроме случаев, когда возникает исключение OptimisticLockingFailureException, и я понятия не имею, почему это так.

GlobalExceptionHandler:

@Component
@Order(-2)
class GlobalExceptionHandler : WebExceptionHandler {

    override fun handle(exchange: ServerWebExchange, throwable: Throwable): Mono<Void> = handleException(throwable)
            .flatMap { it.writeTo(exchange, HandlerStrategiesResponseContext(HandlerStrategies.withDefaults())) }
            .flatMap { Mono.empty<Void>() }

    private fun handleException(ex: Throwable): Mono<ServerResponse> = when (ex) {
        is EntityNotFoundException -> notFound(ex.message)
        is InvalidRequestException,
        is ReferenceKeyNotKnown,
        is InvalidContractTypeException -> badRequest(ex.message)
        is DuplicateKeyException,
        is TransactionException,
        is OptimisticLockingFailureException -> conflict(ex.message)
        else -> errorResponse(HttpStatus.INTERNAL_SERVER_ERROR, ex.message)
    }

    private class HandlerStrategiesResponseContext(val strategies: HandlerStrategies) : ServerResponse.Context {
        override fun viewResolvers(): MutableList<ViewResolver> = strategies.viewResolvers()
        override fun messageWriters(): MutableList<HttpMessageWriter<*>> = strategies.messageWriters()
    }

}

функции notFound, badRequest и errorResponse возвращают Mono с правильным кодом состояния и сообщением.

Кто-нибудь, кто может помочь мне и указать мне в правильном направлении, почему не вызывается исключение OptimistickLockingException?

Thx!

1 Ответ

0 голосов
/ 14 января 2020

Поэтому причина, по которой обработчик исключений не сработал, заключалась в том, что в нашем обработчике все еще был шаг .onErrorContinue, который регистрировал исключение и ничего больше. После перемещения регистрации в GlobalExceptionHandler и удаления onErrorContinue GlobalExceptionHandler работал как ожидалось

...