Spring GraphQL с WebMvc получает заголовки запросов

У меня есть проект Spring GraphQL. Каждый сборщик данных ( @SchemaMapping) будет получать данные из удаленного API, защищенного аутентификацией.

Мне нужно распространить заголовок авторизации из исходного запроса (который я вижу внутри @QueryMapping метод) сборщику данных.

В сборщике данных я могу использовать RequestContextHolder для получения запроса и таких заголовков:

          val request = (RequestContextHolder.getRequestAttributes() as ServletRequestAttributes?)?.getRequest()
    val token = request?.getHeader("authorization")

Это работает, но я боюсь, что это может сломаться. В документации Spring GraphQL говорится, что:

DataFetcher и другие компоненты, вызываемые GraphQL Java, не всегда могут выполняться в том же потоке, что и обработчик Spring MVC, например, если асинхронный WebInterceptor или DataFetcher переключается на другой поток.

Я пробовал добавить ThreadLocalAccessor компонент, но при отладке и чтении исходного кода мне кажется, что restoreValue вызывается только в проекте WebFlux.

Как я могу быть уверен, что получу право RequestContextHolder в проекте WebMvc?

1 ответ

Эта концепция на самом деле предназначена как способ хранения / восстановления значений контекста в среде, где выполнение может происходить асинхронно, в другом потоке, если никакая другая инфраструктура еще не поддерживает это .

В случае Spring WebFlux контекст Reactor уже присутствует и выполняет эту роль. Приложение WebFlux должно использовать реактивные DataFetchersи контекст реактора изначально .

реализации в основном полезны для приложений Spring MVC . Любой ThreadLocalAccessor bean будет автоматически настроен стартером.

В вашем случае вы можете следовать одному из примеров и иметь аналогичное расположение:

Я попытался добавить компонент ThreadLocalAccessor, но после отладки и чтения исходного кода мне кажется, что метод restoreValue вызывается только в проекте WebFlux.

Похоже, вы попробовали этот подход безуспешно - не могли бы вы попробовать с 1.0.0-M3 и сообщить нам, если это не сработает? Вы можете создать проблему в проекте со ссылкой на образец проекта, который воспроизводит проблему.

Другие вопросы по тегам