【发布时间】:2021-12-30 22:44:41
【问题描述】:
我需要将RequestInterceptor 添加到特定的 feign 客户端。拦截器将添加我不想泄露给第三方的身份验证信息,因此我不希望它为所有 Feign 客户端触发。我有这个工作,但这似乎有点混乱,我希望有一个更清洁(更少代码)的选项。
我希望有人能指出我可以简化事情的地方。特别是围绕编码器/解码器的东西。我真的不喜欢他们像那样把我的服务构造函数弄得乱七八糟,而且觉得奇怪的是他们甚至需要一开始就被指定。
我有
// build.gradle
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
我有一个 RequestInterceptor
import feign.RequestInterceptor;
import feign.RequestTemplate;
public class BearerAuthRequestInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
// ... SNIP ... (just adds an Authorization header)
}
}
我有一个 FeignClient
@FeignClient(name = "myfeignclient")
public interface MyFeignClient {
@GetMapping(value = "/doTheThing")
String doTheThing();
}
我从这样的服务中使用我的 FeignClient:
@Service
@Import(FeignClientsConfiguration.class)
public class MyService {
private final MyFeignClient myFeignClient;
@Autowired
public MyService(Decoder decoder, Encoder encoder, Contract contract) {
this.myFeignClient = Feign.builder()
.contract(contract)
.encoder(encoder)
.decoder(decoder)
.requestInterceptor(new BearerAuthRequestInterceptor())
.target(MyFeignClient.class, "https://whatever.com");
}
public void callTheFeignClient() {
myFeignClient.doTheThing();
}
}
【问题讨论】: