1.微服务请求报错:
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.实现RequestInterceptor类,对请求进行处理
(1)FeignConfig.java
package com.jiayou.peis.official.account.biz.config;
import com.jiayou.peis.common.core.util.NonWebRequestAttributes;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import feign.Retryer;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpHeaders;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.RequestContextListener;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Objects;
@Component
@Slf4j
public class FeignConfig implements RequestInterceptor {
public FeignConfig() {
}
@Bean
public Retryer feignRetryer() {
return new Retryer.Default(100, 1000, 5);
}
@Bean
public RequestContextListener requestContextListenerBean() {
return new RequestContextListener();
}
@Override
public void apply(RequestTemplate requestTemplate) {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
if (Objects.nonNull(requestAttributes)) {
RequestContextHolder.setRequestAttributes(requestAttributes, true);
try {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
HttpServletRequest request = attributes.getRequest();
requestTemplate.header(HttpHeaders.AUTHORIZATION, request.getHeader(HttpHeaders.AUTHORIZATION));
} catch (Exception e) {
log.info("定时任务介入,授权异常");
}
} else {
RequestContextHolder.setRequestAttributes(new NonWebRequestAttributes(), Boolean.TRUE);
HttpServletRequest httpRequest = this.getHttpServletRequestSafely();
if (null != httpRequest && null != httpRequest.getAttribute("X-Request-No")) {
requestTemplate.header("X-Request-No", httpRequest.getAttribute("X-Request-No").toString());
}
}
}
public HttpServletRequest getHttpServletRequestSafely() {
try {
RequestAttributes requestAttributesSafely = this.getRequestAttributesSafely();
return requestAttributesSafely instanceof NonWebRequestAttributes ? null : ((ServletRequestAttributes) requestAttributesSafely).getRequest();
} catch (Exception var2) {
return null;
}
}
public RequestAttributes getRequestAttributesSafely() {
RequestAttributes requestAttributes = null;
try {
requestAttributes = RequestContextHolder.currentRequestAttributes();
} catch (IllegalStateException var3) {
requestAttributes = new NonWebRequestAttributes();
}
return requestAttributes;
}
}
(2)NonWebRequestAttributes.java
package com.jiayou.peis.common.core.util;
import org.springframework.web.context.request.RequestAttributes;
public class NonWebRequestAttributes implements RequestAttributes {
public NonWebRequestAttributes() {
}
@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;
}
}
参考:https://blog.csdn.net/nlx1450161741/article/details/111196116