Feign 现在支持 ResponseInterceptor 类。我可以使用 Spring Cloud Feign 来实现它还是需要使用 Feign.builder() ?
在我的自定义 FeignConfig 中尝试过这样的操作:
@Bean
public ClientResponseInterceptor responseInterceptor() {
return new ClientResponseInterceptor();
}
但似乎不起作用。有什么想法如何注入自定义 ResponseInterceptor 吗?
我没有成功使用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只是一个例子)
下面是使用 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>