Spring GraphQL с WebMvc получает заголовки запросов
У меня есть проект Spring GraphQL. Каждый сборщик данных (
@SchemaMapping
) будет получать данные из удаленного API, защищенного аутентификацией.
Мне нужно распространить заголовок авторизации из исходного запроса (который я вижу внутри
@QueryMapping
метод) сборщику данных.
В сборщике данных я могу использовать RequestContextHolder для получения запроса и таких заголовков:
val request = (RequestContextHolder.getRequestAttributes() as ServletRequestAttributes?)?.getRequest()
val token = request?.getHeader("authorization")
Это работает, но я боюсь, что это может сломаться. В
DataFetcher и другие компоненты, вызываемые GraphQL Java, не всегда могут выполняться в том же потоке, что и обработчик Spring MVC, например, если асинхронный WebInterceptor или DataFetcher переключается на другой поток.
Я пробовал добавить
ThreadLocalAccessor
компонент, но при отладке и чтении исходного кода мне кажется, что
restoreValue
вызывается только в проекте WebFlux.
Как я могу быть уверен, что получу право
RequestContextHolder
в проекте WebMvc?
1 ответ
Эта концепция на самом деле предназначена как способ хранения / восстановления значений контекста в среде, где выполнение может происходить асинхронно, в другом потоке, если никакая другая инфраструктура еще не поддерживает это .
В случае Spring WebFlux контекст Reactor уже присутствует и выполняет эту роль. Приложение WebFlux должно использовать реактивные
DataFetchers
и контекст реактора изначально .
реализации в основном полезны для приложений Spring MVC . Любой
ThreadLocalAccessor
bean будет автоматически настроен стартером.
В вашем случае вы можете следовать одному из примеров и иметь аналогичное расположение:
- Объявите фильтр сервлета, который извлекает значение заголовка и устанавливает его как атрибут запроса с известным именем
- Создайте компонент ThreadLocalAccessor и используйте его для хранения атрибутов запроса в контексте.
- Получите соответствующий атрибут из своего
DataFetcher
Я попытался добавить компонент ThreadLocalAccessor, но после отладки и чтения исходного кода мне кажется, что метод restoreValue вызывается только в проекте WebFlux.
Похоже, вы попробовали этот подход безуспешно - не могли бы вы попробовать с 1.0.0-M3 и сообщить нам, если это не сработает? Вы можете создать проблему в проекте со ссылкой на образец проекта, который воспроизводит проблему.