异步线程中使用RestTemplate注入空指针解决
在某种情况下,调用第三方或者jar文件中封装的httpClient时,上层调用采用异步线程调用,导致底层的RestTemplate注入为空,无法正常调用,需要强制将spring的上下文绑定到异步线程中。
强制传递 Spring 上下文到异步线程
假如这里使用的hutool的异步线程工具:
使用 ThreadUtil.execAsync 时,需手动将 Spring 上下文绑定到异步线程:
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;// 捕获主线程的上下文
RequestAttributes mainThreadContext = RequestContextHolder.getRequestAttributes();// 将主线程上下文绑定到异步线程
RequestContextHolder.setRequestAttributes(mainThreadContext, true); // 第二个参数 true 表示继承所有属性ThreadUtil.execAsync(() -> {try {// 调用 JAR 包方法 或者 第三方SDKHttpClient.doGet(...);} catch (Exception e) {log.error("异步请求异常", e);} finally {// 清理线程上下文RequestContextHolder.resetRequestAttributes();}
});