У меня есть этот фрагмент кода:
@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 находятся в одном потоке и одной сопрограмме
Есть идеи, где искать? Буду признателен за любую помощь!