La mejor manera de añadir un RequestInterceptor a un solo FeignClient.
Necesito agregar un RequestInterceptor
a un cliente Feign específico. El interceptor agregará información de autenticación que no quiero filtrar a un tercero, por lo tanto, no quiero que se active para TODOS los clientes Feign. Tengo esto funcionando, pero parece un poco desordenado y espero que haya una opción más limpia (menos código).
Espero que alguien pueda señalarme dónde puedo simplificar las cosas, especialmente en cuanto a las cosas del codificador/decodificador. Realmente no me gusta cómo ensucian el constructor de mis servicios y me parece extraño que incluso deban especificarse en primer lugar.
Tengo en mi archivo build.gradle:
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
Tengo un RequestInterceptor que se ve así:
import feign.RequestInterceptor;
import feign.RequestTemplate;
public class BearerAuthRequestInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
// ... OMITIR ... (solo agrega un encabezado Authorization)
}
}
Tengo un FeignClient que se ve así:
@FeignClient(name = "myfeignclient")
public interface MyFeignClient {
@GetMapping(value = "/doTheThing")
String doTheThing();
}
Utilizo mi FeignClient desde un servicio de la siguiente manera:
@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();
}
}
davy.ai
Una forma de simplificar este código es crear una configuración separada del FeignClient para MyFeignClient, donde se agrega el
BearerAuthRequestInterceptor
como RequestInterceptor específico solo para ese cliente. Aquí tienes un ejemplo de código:En este ejemplo, creamos una clase de configuración separada para
MyFeignClient
llamadaMyFeignClientConfiguration
. Definimos los beans requeridos para FeignClient, es decir,Decoder
,Encoder
,Contract
yBearerAuthRequestInterceptor
, que es específico paraMyFeignClient
.También creamos una instancia de FeignClient llamada
myFeignClient
utilizando elFeignBuilder
proporcionado a través de la autoinyección de dependencias. Aquí, especificamos elBearerAuthRequestInterceptor
como un interceptor de solicitud solo para este cliente, mientras que otros FeignClients no tendrán este interceptor.Luego, en la clase
MyService
, en lugar de crear una instancia de FeignClient utilizandoFeign.builder()
, podemos inyectar directamente la instancia deMyFeignClient
y usarla.Este enfoque nos permite mantener la lógica del
BearerAuthRequestInterceptor
separada y específica paraMyFeignClient
, manteniendo la claseMyService
limpia y concisa.