RequestContextHolder имеет значение null при вызове внешнего API с использованием завершаемого будущего

#spring-boot #spring-security #spring-security-oauth2

#spring-boot #spring-безопасность #spring-security-oauth2

Вопрос:

Я использую CompletableFuture, который вызывает вспомогательный метод, который делает запрос к внешнему API и получает данные. Прежде чем он отправит запрос, я перехватываю и выполняю требуемую авторизацию OAuth2.

Но для запроса я получаю исключение «запрос сервлета не может быть нулевым«, и во время процесса отладки я выяснил, что атрибуты объекта RequestContextHolder имеют значение null, и причиной этого является то, что код выполняется в отдельном потоке. Есть ли какая-либо конфигурация, которую я могу сделать, чтобы всякий раз, когда я использую завершаемое future и вызываю внешний api, он имеет требуемые атрибуты для объекта RequestContextHolder .

 #Snippet from the DefaultOAuth2AuthorizedClientManager class provided by the spring secur
    private static HttpServletRequest getHttpServletRequestOrDefault(Map<String, Object> attributes) {
        HttpServletRequest servletRequest = (HttpServletRequest) attributes.get(HttpServletRequest.class.getName());
        if (servletRequest == null) {
            RequestAttributes context = RequestContextHolder.getRequestAttributes();
            if (context instanceof ServletRequestAttributes) {
                servletRequest = ((ServletRequestAttributes) context).getRequest();
            }
        }
        return servletRequest;
    }

#Code snippet
     CompletableFuture<UserDto> userDetailsFuture = CompletableFuture
          .supplyAsync(() -> {
              //Helper method makes a request to the external API and get the data
            return clientHelper.getUserDetails(userId);
          });
 

Комментарии:

1. @ark- вы нашли какое-либо решение этой проблемы?