相关文章推荐
完美的自行车  ·  Uncaught SyntaxError: ...·  1 年前    · 
开朗的洋葱  ·  WindowsProcess - ...·  1 年前    · 

本文主要研究下spring mvc的No thread-bound request found异常

: java.util.concurrent.CompletionException: 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.

  产生原因在用异步线程处理业务时 server层方法带调用了

HttpServletRequest request = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest();

  解决办法 :1.通过参数传值,不用上面的方法;2:参考:https://www.jianshu.com/p/cf80a0cdab3dhttps://www.jianshu.com/p/cf80a0cdab3d

RequestContextHolder 源码
// Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) package org.springframework.web.context.request; import javax.faces.context.FacesContext; import org.springframework.core.NamedInheritableThreadLocal; import org.springframework.core.NamedThreadLocal; import org.springframework.lang.Nullable; import org.springframework.util.ClassUtils; public abstract class RequestContextHolder { private static final boolean jsfPresent = ClassUtils.isPresent("javax.faces.context.FacesContext", RequestContextHolder.class.getClassLoader()); private static final ThreadLocal<RequestAttributes> requestAttributesHolder = new NamedThreadLocal("Request attributes"); private static final ThreadLocal<RequestAttributes> inheritableRequestAttributesHolder = new NamedInheritableThreadLocal("Request context"); public RequestContextHolder() { public static void resetRequestAttributes() { requestAttributesHolder.remove(); inheritableRequestAttributesHolder.remove(); public static void setRequestAttributes(@Nullable RequestAttributes attributes) { setRequestAttributes(attributes, false); public static void setRequestAttributes(@Nullable RequestAttributes attributes, boolean inheritable) { if (attributes == null) { resetRequestAttributes(); } else if (inheritable) { inheritableRequestAttributesHolder.set(attributes); requestAttributesHolder.remove(); } else { requestAttributesHolder.set(attributes); inheritableRequestAttributesHolder.remove(); @Nullable public static RequestAttributes getRequestAttributes() { RequestAttributes attributes = (RequestAttributes)requestAttributesHolder.get(); if (attributes == null) { attributes = (RequestAttributes)inheritableRequestAttributesHolder.get(); return attributes; public static RequestAttributes currentRequestAttributes() throws IllegalStateException { RequestAttributes attributes = getRequestAttributes(); if (attributes == null) { if (jsfPresent) { attributes = RequestContextHolder.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; private static class FacesRequestAttributesFactory { private FacesRequestAttributesFactory() { @Nullable public static RequestAttributes getFacesRequestAttributes() { FacesContext facesContext = FacesContext.getCurrentInstance(); return facesContext != null ? new FacesRequestAttributes(facesContext) : null;
EMBED THE SNIPPET BELOW IN YOUR SITE