当前位置: 首页 > 知识库问答 >
问题:

如何在SpringBoot中向FaignClient添加自定义拦截器

谈炳
2023-03-14

在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中的RestTemboard bean配置:

@Bean
public RestTemplate restTemplate(final RestTemplateBuilder restTemplateBuilder) {
  return restTemplateBuilder
  .setConnectTimeout(Duration.ofMillis(connectTimeout))
  .setReadTimeout(Duration.ofMillis(readTimeout))
  .build();

将拦截器添加到restTemboard 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);
  }

如何将此拦截器添加到佯装客户端?

正在应用中。yml

feign:
  client:
    config:
      default:
        connectTimeout: 5000
        readTimeout: 5000
        request-interceptors[0]: com.api.restclient.InterceptorOne
        request-interceptors[1]: com.api.log.LogServices

InterceptorOne为假装客户端中的每个请求添加标头:

@Configuration
public class InterceptorOne implements RequestInterceptor {
  @Override
  public void apply(RequestTemplate requestTemplate) {
     requestTemplate.header("some-header", "value");
  }

但是我不能添加日志服务拦截器,因为它由于错误而不能工作,不能转换为类feign。请求拦截器

我的猜测是,我试图添加的拦截器是一个通用拦截器,而不是专门请求拦截器。所以我想知道如何添加一个与RestTemplate类似的通用拦截器来伪装客户端

共有1个答案

慕河
2023-03-14

您可以添加多个拦截器,如下所示

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
 类似资料:
  • 本文向大家介绍SpringBoot添加自定义拦截器的实现代码,包括了SpringBoot添加自定义拦截器的实现代码的使用技巧和注意事项,需要的朋友参考一下 在Controller层时,往往会需要校验或验证某些操作,而在每个Controller写重复代码,工作量比较大,这里在Springboot项目中 ,通过继承WebMvcConfigurerAdapter,添加拦截器。 1、WebMvcConfi

  • 我正在研究spring data rest服务&在自定义拦截器方面面临一些问题。前面我使用了spring-data-rest-webmvc2.2.0&以以下方式添加了拦截器。 对我来说效果很好。但是当我升级到spring-data-rest-webmvc 2.3.0版本时,我注意到handlerMapping隐藏在DelegatingHandlerMapping后面。因此,我尝试以以下方式添加拦截

  • 以下是我的Spring应用程序的相关部分: 上面的方法从未被调用。我需要成为一个Spring bean,因为我需要向它注入其他依赖项。 以下是文件的相关部分:

  • null 我尝试将@priority(interceptor.priority.platform_beform)和@prematching也放入我的过滤器中,但即使是在OIDC启动后也会调用。 另外,是否有任何方法支持扩展quarkus oidc逻辑以包括自定义代码? 我无法获得oidc和keycloak-auth拦截器的优先级(知道这些可以帮助我决定过滤器的优先级)。请帮忙。

  • 我是Perl 6的新手。我的Atom编辑器中有以下代码,但我仍然不明白这是如何工作的。正如docs.raku.org所说,我复制了以下代码,但似乎不起作用。所以我将代码更改为: 输出为: 我知道它是有效的,但是docs.raku.org中的文档与此有点不同,它在第7行的AT-KEY方法之前没有“自”。有没有更详细的例子?

  • 这里是我的拦截器方法,我想在这里设置自定义响应,告诉UI发生了什么 并且在web.xml中 spring-servlet.xml 当会话超时时,它在返回false后不发送任何响应。连下面的都不行