Kotlin | Весна | WebFlux | WebFilter | subscriberContext пуст при ошибке - PullRequest
2 голосов
/ 14 июля 2020

У меня есть этот фрагмент кода:

@Component
class ResponseHeadersWebFilter : WebFilter {
    override fun filter(exchange: ServerWebExchange, chain: WebFilterChain): Mono<Void> {
        exchange.response.beforeCommit {
            Mono.subscriberContext().doOnNext { context ->
                context.get<Map<String, String>>(CONTEXT_MAP).let {
                    exchange.response.headers.apply {
                        add(HEADER_REQUEST_ID, it[METADATA_REQUEST_ID])
                        add(HEADER_USER, it[METADATA_USER])
                    }
                }
            }.then()
        }
        val contextMap = exchange.request.headers.toSingleValueMap().let {
            mapOf(
                    METADATA_REQUEST_ID to it[HEADER_REQUEST_ID],
                    METADATA_USER to it[HEADER_USER]
            )
        }
        return chain.filter(exchange).subscriberContext(Context.of(CONTEXT_MAP, contextMap))
    }
}

Идея состоит в том, чтобы поместить заголовки запроса в контекст, а затем добавить их из контекста в ответ (на основе этой статьи )

Работает, если запрос обработан успешно

Однако, если есть исключение, контекст становится пустым

Я проверил из соответствующего метода @ExceptionHandler (используя coroutineContext [ReactorContext] в функции приостановки) и видит заголовки в контексте. Но когда он переходит к beforeCommit WebFilter, где-то по пути он теряет контекст. Более того, @ExceptionHandler и WebFilter находятся в одном потоке и одной сопрограмме

Есть идеи, где искать? Буду признателен за любую помощь!

...