java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.2、我的使用场景
在@Async注解的方法里进行Feign调用,为什么会出现这个问题尼?是因为我@configurtion里加了这行代码,因为有业务需求我要从request里取到header里的参数
HttpServletRequest request = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest();3、那这个报错信息从何而来?
点进RequestContextHolder这个类,查看源码可知,RequestAttributes - 请求属性线程拿不到了,所以为null,然后就throw new IllegalStateException,以下为源码:
public static RequestAttributes currentRequestAttributes() throws IllegalStateException {
RequestAttributes attributes = getRequestAttributes();
if (attributes == null) {
if (jsfPresent) {
attributes = FacesRequestAttributesFactory.getFacesRequestAttributes();
}
if (attributes == null) {
throw new IllegalStateException("No thread-bound request found: " +
"Are you referring to request attributes outside of an actual web request, " +
"or processing a request outside of the originally receiving thread? " +
"If you are actually operating within a web request and still receive this message, " +
"your code is probably running outside of DispatcherServlet: " +
"In this case, use RequestContextListener or RequestContextFilter to expose the current request.");
}
}
return attributes;
}
4、解决方法
4.2、核心代码只需要在调用异步方法的外面将RequestAttributes对象设置为子线程共享即可
ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); RequestContextHolder.setRequestAttributes(sra, true);4.3、举个栗子
public void childThreadSharing(ScreeningDTO dto) {
// 设置子线程共享
ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
RequestContextHolder.setRequestAttributes(sra, true);
// 开始执行异步方法
this.somethingService.executeAsync();
}



