springcloud 定时调度 另一个服务接口 ) RequestContextHolder.getRequestAttributes() 获取不到数据
时间: 2023-08-06 12:26:48 浏览: 89
SpringCloud-Zuul服务网关
在Spring Cloud中,如果一个服务需要调用另一个服务的接口,并且在接口中需要使用`RequestContextHolder.getRequestAttributes()`获取请求信息,但是在调用时获取不到数据,可能是因为请求的上下文信息没有正确传递。
可以尝试在调用服务的Feign客户端接口中,添加`@RequestLine`注解,并使用`Interceptor`来传递请求的上下文信息:
1. 在调用服务的Feign客户端接口中,添加`@RequestLine`注解:
```
@FeignClient(name = "target-service")
public interface TargetService {
@RequestLine("GET /api/target")
public String getTarget();
}
```
2. 在调用服务中,创建`Interceptor`来传递请求的上下文信息:
```
@Configuration
public class FeignConfiguration {
@Bean
public RequestInterceptor requestInterceptor() {
return new RequestInterceptor() {
@Override
public void apply(RequestTemplate requestTemplate) {
ServletRequestAttributes attributes =
(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attributes != null) {
HttpServletRequest request = attributes.getRequest();
requestTemplate.header("Authorization", request.getHeader("Authorization"));
requestTemplate.header("Cookie", request.getHeader("Cookie"));
// 添加其他需要传递的请求头信息
}
}
};
}
}
```
3. 在调用服务的Feign客户端接口中,添加`configuration`属性,指定使用上述创建的`Interceptor`:
```
@FeignClient(name = "target-service", configuration = FeignConfiguration.class)
public interface TargetService {
@RequestLine("GET /api/target")
public String getTarget();
}
```
通过以上步骤,就可以在调用服务中正确传递请求的上下文信息,使得在接口中可以使用`RequestContextHolder.getRequestAttributes()`获取请求信息。需要注意的是,调用的服务必须已经注册到服务发现中心,并且调用的方法路径必须正确。
阅读全文