spring-boot - SpringBoot中如何给FeignClient添加自定义拦截器
问题描述
在 RestTemplate 我有一个自定义拦截器,它将记录一些请求响应详细信息并保存到数据库。
我的自定义拦截器:
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
@Component
public class LogServices implements ClientHttpRequestInterceptor {
@Override
public ClientHttpResponse intercept(final HttpRequest request, final byte[] body, final ClientHttpRequestExecution execution) throws IOException {
final String uri = request.getURI().toString();
final ClientHttpResponse response = execution.execute(request, body);
//log request response details and save to database
return response;
springboot中的RestTemplate bean配置:
@Bean
public RestTemplate restTemplate(final RestTemplateBuilder restTemplateBuilder) {
return restTemplateBuilder
.setConnectTimeout(Duration.ofMillis(connectTimeout))
.setReadTimeout(Duration.ofMillis(readTimeout))
.build();
将拦截器添加到 restTemplate bean:
@Configuration
public class LogInterceptorConfiguration {
@Autowired
public void configureLogger(final RestTemplate restTemplate, final LogServices logServices) {
final var interceptors = restTemplate.getInterceptors();
interceptors.add(logServices);
restTemplate.setInterceptors(interceptors);
}
如何将此拦截器添加到 FeignClient?
在 application.yml 中:
feign:
client:
config:
default:
connectTimeout: 5000
readTimeout: 5000
request-interceptors[0]: com.api.restclient.InterceptorOne
request-interceptors[1]: com.api.log.LogServices
InterceptorOne 为 feign 客户端中的每个请求添加一个标头:
@Configuration
public class InterceptorOne implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
requestTemplate.header("some-header", "value");
}
但我无法添加LogServices
拦截器,因为它由于错误而不起作用cannot be cast to class feign.RequestInterceptor
我的猜测是我要添加的拦截器是通用拦截器,而不是专门的请求拦截器。所以我想知道如何向 FeignClient 添加一个类似于 RestTemplate 的通用拦截器
解决方案
您可以添加多个拦截器,如下所示
feign:
client:
config:
feignName:
connectTimeout: 5000
readTimeout: 5000
loggerLevel: full
errorDecoder: com.example.SimpleErrorDecoder
retryer: com.example.SimpleRetryer
requestInterceptors:
- com.example.InterceptorOne
- com.example.LogServices
decode404: false
encoder: com.example.SimpleEncoder
decoder: com.example.SimpleDecoder
contract: com.example.SimpleContract
推荐阅读
- google-cloud-platform - GCP Pub/Sub 调用 Cloud Function 两次
- json - 使用 Rest Template 交换方法将 Json 映射到 POJO 类
- r - 对具有两个连接条件的 data.table 进行子集
- visual-studio - 如何在不安装整个 Visual Studio 的情况下安装 editbin.exe?
- javascript - Vue.js 应用程序中的“TypeError:使用过滤方法时无法将未定义或 null 转换为对象”
- karate - 空手道:跳过对外部/第三方服务的调用
- python - 如何以块的形式写入文件以规避大文件大小的错误?
- laravel-5 - 如何将 phpunit 错误发送到 Laravel 日志通道?即松弛?
- c - 调用内核运行所需的 clGetDeviceInfo
- reverse-proxy - 反向代理背后的 Jfrog Xray