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