Spring boot 使用completable future调用外部API时,RequestContextHolder为null

Spring boot 使用completable future调用外部API时,RequestContextHolder为null,spring-boot,spring-security,spring-security-oauth2,Spring Boot,Spring Security,Spring Security Oauth2,我正在使用CompletableFuture,它调用一个helper方法,向外部API发出请求并获取数据。在它发出请求之前,我正在拦截并执行所需的OAuth2授权 但是对于请求,我得到了“servlet请求不能为null”异常,在调试过程中,我发现RequestContextHolder对象的属性为null,原因是代码在单独的线程上执行。我是否可以进行任何配置,以便无论何时使用completable future并调用外部api,它都具有RequestContextHolder对象所需的属性 #

我正在使用CompletableFuture,它调用一个helper方法,向外部API发出请求并获取数据。在它发出请求之前,我正在拦截并执行所需的OAuth2授权

但是对于请求,我得到了“servlet请求不能为null”异常,在调试过程中,我发现RequestContextHolder对象的属性为null,原因是代码在单独的线程上执行。我是否可以进行任何配置,以便无论何时使用completable 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);
          });
#来自spring secur提供的DefaultOAuth2AuthorizedClientManager类的片段
私有静态HttpServletRequestGetHttpServletRequestOrDefault(映射属性){
HttpServletRequest servletRequest=(HttpServletRequest)attributes.get(HttpServletRequest.class.getName());
if(servletRequest==null){
RequestAttributes上下文=RequestContextHolder.getRequestAttributes();
if(ServletRequestAttributes的上下文实例){
servletRequest=((ServletRequestAttributes)上下文).getRequest();
}
}
返回servletRequest;
}
#代码片段
CompletableFuture用户详细信息未来=CompletableFuture
.SupplySync(()->{
//Helper方法向外部API发出请求并获取数据
返回clientHelper.getUserDetails(userId);
});