我在我的项目中使用 feign。我创建了自定义配置,但它被默认配置覆盖。步骤如下:
SpringBootApplication.java
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class MyApplication {}
FeignConfiguration.java
@RequiredArgsConstructor
public class FeignConfiguration{
private final MyConfigurationProperties myConfigProperties;
@Bean
public MetaDataRestClient metaDataRestClient(@Qualifier("metaDataHttpClient") okhttp3.OkHttpClient metaDataHttpClient) {
return Feign.builder()
.retryer(Retryer.NEVER_RETRY)
.client(new OkHttpClient(metaDataHttpClient))
.encoder(new JacksonEncoder(XML_MAPPER))
.decoder(new JacksonDecoder(XML_MAPPER))
.contract(new SpringMvcContract())
.logger(new Slf4jLogger(MetaDataRestClient.class))
.logLevel(Logger.Level.FULL)
.target(MetaDataRestClient.class, myConfigProperties.getMetadata().getEndpoint());
}
@Primary
@Bean(name = "metaDataHttpClient")
public okhttp3.OkHttpClient metaDataHttpClientWithProxy() {
return OkHttpUtil.createNewHttpClientBuilderWithProxy(myConfigProperties.getMetadata().getFeignClient().getConnectTimeout(),
myConfigProperties.getMetadata().getFeignClient().getReadTimeout()).build();
}
MetaDataRestClient.java
@FeignClient(name = "metaDataRestClient", url = "https://myurl.net", configuration = FeignConfiguration.class)
public interface MetaDataRestClient {
@Headers("Content-Type: text/xml")
@GetMapping("/metadata")
public EntityDescriptor getMetadaData();
}
我看到
metaDataRestClient
bean 在启动时被触发,但是当我深入研究 feign 库代码时,我发现这个方法被触发了两次:第一次使用我的自定义 OkHttpClient,第二次使用名为 org.springframework.cloud.sleuth.instrument.web.client.feign.LazyClient
的东西。所以我的自定义 OkHttpClient 被这个懒惰的客户端覆盖了。
这里是被触发两次的相关Feign库代码:
FeignBuilder.java
public Builder client(Client client) {
this.client = client;
return this;
}
我的 application.yaml 文件中没有任何假配置。这可能是什么原因?
谢谢。
同样的问题,你解决了吗?如果解决了怎么解决。