From f1cfa56c3daae1bbaf2d813730c5f62512a3500a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E9=AD=8F=2C=E5=B0=8F=E9=AD=8F=2C=E6=88=91?= =?UTF-8?q?=E4=BB=AC=E8=A6=81=E5=8E=BB=E5=93=AA=E9=87=8C=E5=91=80?= Date: Thu, 19 Jan 2023 20:51:23 +0800 Subject: [PATCH 1/4] okhttp supports custom protocols --- .../openfeign/FeignAutoConfiguration.java | 6 +- .../support/FeignHttpClientProperties.java | 15 ++++ .../FeignOkHttpConfigurationTests.java | 13 ++- .../cloud/openfeign/protocol/Application.java | 79 +++++++++++++++++++ .../protocol/FeignOkProtocolsTests.java | 61 ++++++++++++++ 5 files changed, 172 insertions(+), 2 deletions(-) create mode 100644 spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/protocol/Application.java create mode 100644 spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/protocol/FeignOkProtocolsTests.java diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignAutoConfiguration.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignAutoConfiguration.java index cf1906aeb..972629ad9 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignAutoConfiguration.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignAutoConfiguration.java @@ -41,6 +41,7 @@ import feign.okhttp.OkHttpClient; import jakarta.annotation.PreDestroy; import okhttp3.ConnectionPool; +import okhttp3.Protocol; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -92,6 +93,7 @@ * @author Sam Kruglov * @author Wojciech Mąka * @author Dangzhicairang(小水牛) + * @author changjin wei(魏昌进) */ @Configuration(proxyBeanMethods = false) @ConditionalOnClass(Feign.class) @@ -259,11 +261,13 @@ public okhttp3.OkHttpClient okHttpClient(okhttp3.OkHttpClient.Builder builder, C int connectTimeout = httpClientProperties.getConnectionTimeout(); boolean disableSslValidation = httpClientProperties.isDisableSslValidation(); Duration readTimeout = httpClientProperties.getOkHttp().getReadTimeout(); + List protocols = httpClientProperties.getOkHttp().getProtocols(); if (disableSslValidation) { disableSsl(builder); } this.okHttpClient = builder.connectTimeout(connectTimeout, TimeUnit.MILLISECONDS) - .followRedirects(followRedirects).readTimeout(readTimeout).connectionPool(connectionPool).build(); + .followRedirects(followRedirects).readTimeout(readTimeout).connectionPool(connectionPool) + .protocols(protocols).build(); return this.okHttpClient; } diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/support/FeignHttpClientProperties.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/support/FeignHttpClientProperties.java index 88ac5682d..63c9b9aa4 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/support/FeignHttpClientProperties.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/support/FeignHttpClientProperties.java @@ -17,9 +17,11 @@ package org.springframework.cloud.openfeign.support; import java.time.Duration; +import java.util.List; import java.util.concurrent.TimeUnit; import feign.okhttp.OkHttpClient; +import okhttp3.Protocol; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -336,6 +338,11 @@ public static class OkHttp { */ private Duration readTimeout = Duration.ofSeconds(60); + /** + * Configure the protocols used by this client to communicate with remote servers. + */ + private List protocols = List.of(Protocol.HTTP_2, Protocol.HTTP_1_1); + public Duration getReadTimeout() { return readTimeout; } @@ -344,6 +351,14 @@ public void setReadTimeout(Duration readTimeout) { this.readTimeout = readTimeout; } + public List getProtocols() { + return protocols; + } + + public void setProtocols(List protocols) { + this.protocols = protocols; + } + } } diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignOkHttpConfigurationTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignOkHttpConfigurationTests.java index a50f538c1..21ebb8442 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignOkHttpConfigurationTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignOkHttpConfigurationTests.java @@ -17,10 +17,12 @@ package org.springframework.cloud.openfeign; import java.lang.reflect.Field; +import java.util.List; import javax.net.ssl.HostnameVerifier; import okhttp3.OkHttpClient; +import okhttp3.Protocol; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -34,6 +36,7 @@ /** * @author Ryan Baxter + * @author changjin wei(魏昌进) */ class FeignOkHttpConfigurationTests { @@ -45,7 +48,8 @@ void setUp() { .properties("debug=true", "spring.cloud.openfeign.httpclient.disableSslValidation=true", "spring.cloud.openfeign.okhttp.enabled=true", "spring.cloud.openfeign.httpclient.hc5.enabled=false", - "spring.cloud.openfeign.httpclient.okhttp.read-timeout=9s") + "spring.cloud.openfeign.httpclient.okhttp.read-timeout=9s", + "spring.cloud.openfeign.httpclient.okhttp.protocols=H2_PRIOR_KNOWLEDGE") .web(WebApplicationType.NONE).sources(FeignAutoConfiguration.class).run(); } @@ -71,6 +75,13 @@ void shouldConfigureReadTimeout() { assertThat(httpClient.readTimeoutMillis()).isEqualTo(9000); } + @Test + void shouldProtocols() { + OkHttpClient httpClient = context.getBean(OkHttpClient.class); + + assertThat(httpClient.protocols()).isEqualTo(List.of(Protocol.H2_PRIOR_KNOWLEDGE)); + } + protected Object getField(Object target, String name) { Field field = ReflectionUtils.findField(target.getClass(), name); ReflectionUtils.makeAccessible(field); diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/protocol/Application.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/protocol/Application.java new file mode 100644 index 000000000..49fa84b37 --- /dev/null +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/protocol/Application.java @@ -0,0 +1,79 @@ +/* + * Copyright 2013-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.openfeign.protocol; + +import jakarta.servlet.http.HttpServletRequest; + +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.web.server.LocalServerPort; +import org.springframework.cloud.client.DefaultServiceInstance; +import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient; +import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients; +import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier; +import org.springframework.cloud.loadbalancer.support.ServiceInstanceListSuppliers; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.cloud.openfeign.test.NoSecurityConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author changjin wei(魏昌进) + */ +public class Application { + + @FeignClient("localapp1") + protected interface ProtocolClient { + + @GetMapping("/protocol") + String getProtocol(); + + } + + @Configuration(proxyBeanMethods = false) + @EnableAutoConfiguration + @RestController + @EnableFeignClients(clients = { ProtocolClient.class }) + @LoadBalancerClients({ @LoadBalancerClient(name = "localapp1", configuration = LocalClientConfiguration.class) }) + @Import(NoSecurityConfiguration.class) + protected static class ProtocolController { + + @GetMapping("/protocol") + public String getProtocol(HttpServletRequest request) { + return request.getProtocol(); + } + + } + + @Configuration(proxyBeanMethods = false) + static class LocalClientConfiguration { + + @LocalServerPort + private int port = 0; + + @Bean + public ServiceInstanceListSupplier staticServiceInstanceListSupplier() { + return ServiceInstanceListSuppliers.from("local", + new DefaultServiceInstance("local-1", "local", "localhost", port, false)); + } + + } + +} diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/protocol/FeignOkProtocolsTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/protocol/FeignOkProtocolsTests.java new file mode 100644 index 000000000..4848f0875 --- /dev/null +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/protocol/FeignOkProtocolsTests.java @@ -0,0 +1,61 @@ +/* + * Copyright 2013-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.openfeign.protocol; + +import feign.Client; +import org.junit.jupiter.api.Test; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient; +import org.springframework.test.annotation.DirtiesContext; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * @author changjin wei(魏昌进) + */ +@SpringBootTest(classes = Application.ProtocolController.class, webEnvironment = WebEnvironment.RANDOM_PORT, + value = { "spring.application.name=feignclienttest", "spring.cloud.openfeign.circuitbreaker.enabled=false", + "spring.cloud.openfeign.httpclient.hc5.enabled=false", "spring.cloud.openfeign.okhttp.enabled=true", + "spring.cloud.httpclientfactories.ok.enabled=true", "spring.cloud.loadbalancer.retry.enabled=false", + "server.http2.enabled=true", "spring.cloud.openfeign.httpclient.okhttp.protocols=H2_PRIOR_KNOWLEDGE" }) +@DirtiesContext +class FeignOkProtocolsTests { + + @Autowired + private Client feignClient; + + @Autowired + private Application.ProtocolClient protocolClient; + + @Test + void testFeignClientType() { + assertThat(feignClient).isInstanceOf(FeignBlockingLoadBalancerClient.class); + FeignBlockingLoadBalancerClient client = (FeignBlockingLoadBalancerClient) feignClient; + Client delegate = client.getDelegate(); + assertThat(delegate).isInstanceOf(feign.okhttp.OkHttpClient.class); + } + + @Test + void shouldHttp2() { + String protocol = protocolClient.getProtocol(); + assertThat(protocol).isEqualTo("HTTP/2.0"); + } + +} From f735dc090e99bbd273d4ea2c375be4f5309aa1b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E9=AD=8F=2C=E5=B0=8F=E9=AD=8F=2C=E6=88=91?= =?UTF-8?q?=E4=BB=AC=E8=A6=81=E5=8E=BB=E5=93=AA=E9=87=8C=E5=91=80?= Date: Thu, 2 Feb 2023 22:48:21 +0800 Subject: [PATCH 2/4] okhttp supports custom protocols. Optimize code --- .../FeignOkHttpConfigurationTests.java | 6 +- .../cloud/openfeign/protocol/Application.java | 79 ------------------- .../protocol/FeignOkProtocolsTests.java | 37 ++++++--- 3 files changed, 30 insertions(+), 92 deletions(-) delete mode 100644 spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/protocol/Application.java diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignOkHttpConfigurationTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignOkHttpConfigurationTests.java index 21ebb8442..63fec903c 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignOkHttpConfigurationTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignOkHttpConfigurationTests.java @@ -17,8 +17,6 @@ package org.springframework.cloud.openfeign; import java.lang.reflect.Field; -import java.util.List; - import javax.net.ssl.HostnameVerifier; import okhttp3.OkHttpClient; @@ -76,10 +74,10 @@ void shouldConfigureReadTimeout() { } @Test - void shouldProtocols() { + void shouldResolveProtocolFromProperties() { OkHttpClient httpClient = context.getBean(OkHttpClient.class); - assertThat(httpClient.protocols()).isEqualTo(List.of(Protocol.H2_PRIOR_KNOWLEDGE)); + assertThat(httpClient.protocols()).containsExactly(Protocol.H2_PRIOR_KNOWLEDGE); } protected Object getField(Object target, String name) { diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/protocol/Application.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/protocol/Application.java deleted file mode 100644 index 49fa84b37..000000000 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/protocol/Application.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2013-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cloud.openfeign.protocol; - -import jakarta.servlet.http.HttpServletRequest; - -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.web.server.LocalServerPort; -import org.springframework.cloud.client.DefaultServiceInstance; -import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient; -import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients; -import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier; -import org.springframework.cloud.loadbalancer.support.ServiceInstanceListSuppliers; -import org.springframework.cloud.openfeign.EnableFeignClients; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.cloud.openfeign.test.NoSecurityConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * @author changjin wei(魏昌进) - */ -public class Application { - - @FeignClient("localapp1") - protected interface ProtocolClient { - - @GetMapping("/protocol") - String getProtocol(); - - } - - @Configuration(proxyBeanMethods = false) - @EnableAutoConfiguration - @RestController - @EnableFeignClients(clients = { ProtocolClient.class }) - @LoadBalancerClients({ @LoadBalancerClient(name = "localapp1", configuration = LocalClientConfiguration.class) }) - @Import(NoSecurityConfiguration.class) - protected static class ProtocolController { - - @GetMapping("/protocol") - public String getProtocol(HttpServletRequest request) { - return request.getProtocol(); - } - - } - - @Configuration(proxyBeanMethods = false) - static class LocalClientConfiguration { - - @LocalServerPort - private int port = 0; - - @Bean - public ServiceInstanceListSupplier staticServiceInstanceListSupplier() { - return ServiceInstanceListSuppliers.from("local", - new DefaultServiceInstance("local-1", "local", "localhost", port, false)); - } - - } - -} diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/protocol/FeignOkProtocolsTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/protocol/FeignOkProtocolsTests.java index 4848f0875..625c1526a 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/protocol/FeignOkProtocolsTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/protocol/FeignOkProtocolsTests.java @@ -16,21 +16,31 @@ package org.springframework.cloud.openfeign.protocol; +import java.lang.reflect.Field; + import feign.Client; +import okhttp3.Protocol; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients; import org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient; +import org.springframework.cloud.openfeign.test.NoSecurityConfiguration; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import org.springframework.test.annotation.DirtiesContext; +import org.springframework.util.ReflectionUtils; +import org.springframework.web.bind.annotation.RestController; import static org.assertj.core.api.Assertions.assertThat; /** * @author changjin wei(魏昌进) */ -@SpringBootTest(classes = Application.ProtocolController.class, webEnvironment = WebEnvironment.RANDOM_PORT, +@SpringBootTest(classes = FeignOkProtocolsTests.Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { "spring.application.name=feignclienttest", "spring.cloud.openfeign.circuitbreaker.enabled=false", "spring.cloud.openfeign.httpclient.hc5.enabled=false", "spring.cloud.openfeign.okhttp.enabled=true", "spring.cloud.httpclientfactories.ok.enabled=true", "spring.cloud.loadbalancer.retry.enabled=false", @@ -41,21 +51,30 @@ class FeignOkProtocolsTests { @Autowired private Client feignClient; - @Autowired - private Application.ProtocolClient protocolClient; - @Test - void testFeignClientType() { + void shouldCreateCorrectFeignClientBeanWithProtocolFromProperties() { assertThat(feignClient).isInstanceOf(FeignBlockingLoadBalancerClient.class); FeignBlockingLoadBalancerClient client = (FeignBlockingLoadBalancerClient) feignClient; Client delegate = client.getDelegate(); assertThat(delegate).isInstanceOf(feign.okhttp.OkHttpClient.class); + okhttp3.OkHttpClient OkHttpClient = (okhttp3.OkHttpClient) getField(delegate, "delegate"); + assertThat(OkHttpClient.protocols()).containsExactly(Protocol.H2_PRIOR_KNOWLEDGE); + } - @Test - void shouldHttp2() { - String protocol = protocolClient.getProtocol(); - assertThat(protocol).isEqualTo("HTTP/2.0"); + protected Object getField(Object target, String name) { + Field field = ReflectionUtils.findField(target.getClass(), name); + ReflectionUtils.makeAccessible(field); + return ReflectionUtils.getField(field, target); + } + + @Configuration(proxyBeanMethods = false) + @EnableAutoConfiguration + @RestController + @LoadBalancerClients + @Import(NoSecurityConfiguration.class) + public static class Application { + } } From 27f6c382eb6726069a541bfd4bc3b43b9791fd0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E9=AD=8F=2C=E5=B0=8F=E9=AD=8F=2C=E6=88=91?= =?UTF-8?q?=E4=BB=AC=E8=A6=81=E5=8E=BB=E5=93=AA=E9=87=8C=E5=91=80?= Date: Fri, 3 Feb 2023 19:22:24 +0800 Subject: [PATCH 3/4] okhttp supports custom protocols. Optimize code --- .../cloud/openfeign/protocol/FeignOkProtocolsTests.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/protocol/FeignOkProtocolsTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/protocol/FeignOkProtocolsTests.java index 625c1526a..951fd062e 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/protocol/FeignOkProtocolsTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/protocol/FeignOkProtocolsTests.java @@ -59,7 +59,6 @@ void shouldCreateCorrectFeignClientBeanWithProtocolFromProperties() { assertThat(delegate).isInstanceOf(feign.okhttp.OkHttpClient.class); okhttp3.OkHttpClient OkHttpClient = (okhttp3.OkHttpClient) getField(delegate, "delegate"); assertThat(OkHttpClient.protocols()).containsExactly(Protocol.H2_PRIOR_KNOWLEDGE); - } protected Object getField(Object target, String name) { @@ -73,7 +72,7 @@ protected Object getField(Object target, String name) { @RestController @LoadBalancerClients @Import(NoSecurityConfiguration.class) - public static class Application { + protected static class Application { } From 323657bc9670a6867bc8d4640147b40a97f99c52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E9=AD=8F=2C=E5=B0=8F=E9=AD=8F=2C=E6=88=91?= =?UTF-8?q?=E4=BB=AC=E8=A6=81=E5=8E=BB=E5=93=AA=E9=87=8C=E5=91=80?= Date: Fri, 3 Feb 2023 19:34:51 +0800 Subject: [PATCH 4/4] okhttp supports custom protocols. Optimize code --- .../cloud/openfeign/FeignOkHttpConfigurationTests.java | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignOkHttpConfigurationTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignOkHttpConfigurationTests.java index 63fec903c..ec55790b6 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignOkHttpConfigurationTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignOkHttpConfigurationTests.java @@ -17,6 +17,7 @@ package org.springframework.cloud.openfeign; import java.lang.reflect.Field; + import javax.net.ssl.HostnameVerifier; import okhttp3.OkHttpClient;