错误信息
The bean ‘client’, defined in class path resource [org/springframework/cloud/openfeign/clientconfig/OkHttpFeignConfiguration.class], could not be registered. A bean with that name has already been defined in class path resource [com/ctct/scan/wingshield/biz/dependence/config/WingShieldFeignHttpsConfig.class] and overriding is disabled.
Action:
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
解释
上面这种情况出现,在项目中使用了okclient,但同时又引入的其他的配置并且添加了@Configuration那么就会在项目启动的时候扫描手写的配置跟okclient的冲突,所以解决办法就是去掉@Configuration,因为@FeignClient引入的配置类是可以不加@Configuration,只需要是一个正常的配置类即可
……还有httpclient是支持https的,一般添加的配置类是指跳过了https的证书认证。……我被同事写的注释误导了,以为httpsclient不支持https,下方代码是提供的支持https的配置
public class FeignHttpsConfig {
public static SSLSocketFactory feignTrustingSSLSocketFactory = null;
@Bean
public Client client() {
if (feignTrustingSSLSocketFactory == null) {
try {
feignTrustingSSLSocketFactory = getFeignTrustingSSLSocketFactory();
} catch (Exception e) {
e.printStackTrace();
}
}
Client client = new Client.Default(feignTrustingSSLSocketFactory, new NoopHostnameVerifier());
return client;
}
public static SSLSocketFactory getFeignTrustingSSLSocketFactory() throws Exception {
TrustManager[] trustAllCerts = new TrustManager[1];
TrustManager tm = new miTM();
trustAllCerts[0] = tm;
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, null);
return sc.getSocketFactory();
}
static class miTM implements TrustManager, X509TrustManager {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public boolean isServerTrusted(java.security.cert.X509Certificate[] certs) {
return true;
}
public boolean isClientTrusted(java.security.cert.X509Certificate[] certs) {
return true;
}
public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType)
throws java.security.cert.CertificateException {
return;
}
public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType)
throws java.security.cert.CertificateException {
return;
}
}
}