使用 Spring Cloud OpenFeign 的 Feign 响应拦截器

问题描述 投票:0回答:2

Feign 现在支持 ResponseInterceptor 类。我可以使用 Spring Cloud Feign 来实现它还是需要使用 Feign.builder() ?

在我的自定义 FeignConfig 中尝试过这样的操作:

@Bean
public ClientResponseInterceptor responseInterceptor() {
    return new ClientResponseInterceptor();
}

但似乎不起作用。有什么想法如何注入自定义 ResponseInterceptor 吗?

java spring spring-cloud-feign feign
2个回答
0
投票

我没有成功使用ResponseInterceptor。

但是我找到了使用 feign.codec.Decoder 的替代方案。

在这个例子中,我正在阅读每个 Feign 客户端响应的

Content-Language
:

public class ClientResponseInterceptor implements Decoder {

    private final JacksonDecoder delegate;

    public ClientResponseInterceptor(JacksonDecoder delegate) {
        this.delegate = delegate;
    }

    @Override
    public Object decode(Response response, Type type) throws IOException, FeignException {
        String contentLanguageFromFeignResponse;

        Collection<String> contentLanguage = response.headers().get(HttpHeaders.CONTENT_LANGUAGE);
        // Extract this part in another method
        if (contentLanguage != null && !contentLanguage.isEmpty()) {
            Optional<String> attributeOpt = contentLanguage.stream().findFirst();
            if (attributeOpt.isPresent()) {
                contentLanguageFromFeignResponse = attributeOpt.get();
            }
        }

        // Do something with contentLanguageFromFeignResponse

        return delegate.decode(response, type);
    }
}

并在你的 feign 配置文件中声明它:

@Bean
public ClientResponseInterceptor responseInterceptor() {
    return new ClientResponseInterceptor(new JacksonDecoder(/*objectMapper*/));
}

(你可以使用其他解码器,JacksonDecoder只是一个例子)


0
投票

下面是使用 spring-boot 为 openfeign 实现 ResponseInterceptor 的示例代码。

import feign.InvocationContext;
import feign.ResponseInterceptor;
import org.springframework.stereotype.Component;

@Component
public class FeignClientInterceptor implements ResponseInterceptor {

    @Override
    public Object aroundDecode(InvocationContext invocationContext) {

        feign.Response response= invocationContext.response();
        feign.Request request=response.request();

        //Do something with request and response        

        return invocationContext.proceed();
    }
}

本示例使用的依赖项:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>2022.0.1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>
© www.soinside.com 2019 - 2024. All rights reserved.