在多线程环境下,由于线程的异步执行特性,可能会导致当前线程尝试访问请求对象时,找不到对应的请求对象,从而抛出异常
异常信息:
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.
at org.springframework.web.context.request.RequestContextHolder.currentRequestAttributes(RequestContextHolder.java:131)
解决方式:
我们可以通过RequestContextHolder类来设置当前请求对象的上下文信息。
RequestAttributes requestAttributes = new NonRequestAttributes();
RequestContextHolder.setRequestAttributes(requestAttributes, true);
import org.springframework.web.context.request.RequestAttributes;
public class NonRequestAttributes implements RequestAttributes {
@Override
public Object getAttribute(String s, int i) {
return null;
}
@Override
public void setAttribute(String s, Object o, int i) {
}
@Override
public void removeAttribute(String s, int i) {
}
@Override
public String[] getAttributeNames(int i) {
return new String[0];
}
@Override
public void registerDestructionCallback(String s, Runnable runnable, int i) {
}
@Override
public Object resolveReference(String s) {
return null;
}
@Override
public String getSessionId() {
return null;
}
@Override
public Object getSessionMutex() {
return null;
}
}