在开启新线程之前,将servletRequestAttributes设置为子线程共享
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
RequestContextHolder.setRequestAttributes(servletRequestAttributes,true);
如果非web请求(定时任务或者消息消费)造成的,可以通过以下方式设置,在触发报错的类里面加上一个自己封装的方法getRequestAttributesSafely(),具体可以参考下面:
public RequestAttributes getRequestAttributesSafely(){
RequestAttributes requestAttributes = null;
try{
requestAttributes = RequestContextHolder.currentRequestAttributes();
}catch (IllegalStateException e){
requestAttributes = new NonWebRequestAttributes();
}
return requestAttributes;
}