Merge remote-tracking branch 'KENNYSOFT/fcc-querymapencoder'

This commit is contained in:
Olga MaciaszekSharma
2021-11-30 12:47:04 +01:00
7 changed files with 52 additions and 3 deletions

View File

@@ -196,6 +196,7 @@ feign:
capabilities:
- com.example.FooCapability
- com.example.BarCapability
queryMapEncoder: com.example.SimpleQueryMapEncoder
metrics.enabled: false
----

View File

@@ -68,6 +68,7 @@ import org.springframework.util.StringUtils;
* @author Jonatan Ivanov
* @author Sam Kruglov
* @author Jasbir Singh
* @author Hyeonmin Park
*/
public class FeignClientFactoryBean
implements FactoryBean<Object>, InitializingBean, ApplicationContextAware, BeanFactoryAware {
@@ -295,6 +296,10 @@ public class FeignClientFactoryBean
if (config.getCapabilities() != null) {
config.getCapabilities().stream().map(this::getOrInstantiate).forEach(builder::addCapability);
}
if (config.getQueryMapEncoder() != null) {
builder.queryMapEncoder(getOrInstantiate(config.getQueryMapEncoder()));
}
}
private void addDefaultQueryParams(FeignClientProperties.FeignClientConfiguration config, Feign.Builder builder) {

View File

@@ -26,6 +26,7 @@ import feign.Capability;
import feign.Contract;
import feign.ExceptionPropagationPolicy;
import feign.Logger;
import feign.QueryMapEncoder;
import feign.RequestInterceptor;
import feign.Retryer;
import feign.codec.Decoder;
@@ -40,6 +41,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
* @author Ram Anaswara
* @author Jonatan Ivanov
* @author Olga Maciaszek-Sharma
* @author Hyeonmin Park
*/
@ConfigurationProperties("feign.client")
public class FeignClientProperties {
@@ -139,6 +141,8 @@ public class FeignClientProperties {
private List<Class<Capability>> capabilities;
private Class<QueryMapEncoder> queryMapEncoder;
private MetricsProperties metrics;
private Boolean followRedirects;
@@ -255,6 +259,14 @@ public class FeignClientProperties {
this.capabilities = capabilities;
}
public Class<QueryMapEncoder> getQueryMapEncoder() {
return queryMapEncoder;
}
public void setQueryMapEncoder(Class<QueryMapEncoder> queryMapEncoder) {
this.queryMapEncoder = queryMapEncoder;
}
public MetricsProperties getMetrics() {
return metrics;
}
@@ -289,7 +301,8 @@ public class FeignClientProperties {
&& Objects.equals(exceptionPropagationPolicy, that.exceptionPropagationPolicy)
&& Objects.equals(defaultRequestHeaders, that.defaultRequestHeaders)
&& Objects.equals(defaultQueryParameters, that.defaultQueryParameters)
&& Objects.equals(capabilities, that.capabilities) && Objects.equals(metrics, that.metrics)
&& Objects.equals(capabilities, that.capabilities)
&& Objects.equals(queryMapEncoder, that.queryMapEncoder) && Objects.equals(metrics, that.metrics)
&& Objects.equals(followRedirects, that.followRedirects);
}
@@ -297,7 +310,7 @@ public class FeignClientProperties {
public int hashCode() {
return Objects.hash(loggerLevel, connectTimeout, readTimeout, retryer, errorDecoder, requestInterceptors,
decode404, encoder, decoder, contract, exceptionPropagationPolicy, defaultQueryParameters,
defaultRequestHeaders, capabilities, metrics, followRedirects);
defaultRequestHeaders, capabilities, queryMapEncoder, metrics, followRedirects);
}
}

View File

@@ -24,6 +24,7 @@ import feign.Capability;
import feign.Contract;
import feign.ExceptionPropagationPolicy;
import feign.Logger;
import feign.QueryMapEncoder;
import feign.RequestInterceptor;
import feign.Retryer;
import feign.codec.Decoder;
@@ -43,6 +44,7 @@ import static org.springframework.cloud.openfeign.test.EqualsAndHashCodeAssert.a
/**
* @author Jonatan Ivanov
* @author Hyeonmin Park
*/
class FeignClientConfigurationTests {
@@ -64,6 +66,7 @@ class FeignClientConfigurationTests {
assertThat(config.getContract()).isNull();
assertThat(config.getExceptionPropagationPolicy()).isNull();
assertThat(config.getCapabilities()).isNull();
assertThat(config.getQueryMapEncoder()).isNull();
assertThat(config.getMetrics()).isNull();
}
@@ -88,6 +91,7 @@ class FeignClientConfigurationTests {
config.setExceptionPropagationPolicy(ExceptionPropagationPolicy.UNWRAP);
List<Class<Capability>> capabilities = Lists.list(Capability.class);
config.setCapabilities(capabilities);
config.setQueryMapEncoder(QueryMapEncoder.class);
FeignClientProperties.MetricsProperties metrics = new FeignClientProperties.MetricsProperties();
config.setMetrics(metrics);
@@ -105,6 +109,7 @@ class FeignClientConfigurationTests {
assertThat(config.getContract()).isSameAs(Contract.class);
assertThat(config.getExceptionPropagationPolicy()).isSameAs(ExceptionPropagationPolicy.UNWRAP);
assertThat(config.getCapabilities()).isSameAs(capabilities);
assertThat(config.getQueryMapEncoder()).isSameAs(QueryMapEncoder.class);
assertThat(config.getMetrics()).isSameAs(metrics);
}

View File

@@ -37,6 +37,7 @@ import javax.servlet.http.HttpServletRequest;
import feign.Capability;
import feign.Feign;
import feign.InvocationHandlerFactory;
import feign.QueryMapEncoder;
import feign.Request;
import feign.RequestInterceptor;
import feign.RequestTemplate;
@@ -78,6 +79,7 @@ import static org.springframework.boot.test.context.SpringBootTest.WebEnvironmen
* @author Olga Maciaszek-Sharma
* @author Ilia Ilinykh
* @author Jonatan Ivanov
* @author Hyeonmin Park
*/
@SuppressWarnings("FieldMayBeFinal")
@SpringBootTest(classes = FeignClientUsingPropertiesTests.Application.class, webEnvironment = RANDOM_PORT)
@@ -246,6 +248,19 @@ public class FeignClientUsingPropertiesTests {
.hasAtLeastOneElementOfType(MicrometerCapability.class);
}
@Test
public void clientShouldContainQueryMapEncoder() {
fooFactoryBean.setApplicationContext(applicationContext);
Feign.Builder feignBuilder = fooFactoryBean.feign(context);
FooClient fooClient = feignBuilder.target(FooClient.class, "http://localhost:" + port);
String response = fooClient.foo();
assertThat(response).isEqualTo("OK");
QueryMapEncoder queryMapEncoder = (QueryMapEncoder) ReflectionTestUtils.getField(feignBuilder,
"queryMapEncoder");
assertThat(queryMapEncoder).isInstanceOf(NoOpQueryMapEncoder.class);
}
@Test
@DisabledForJreRange(min = JRE.JAVA_16)
public void shouldSetFollowRedirects() {
@@ -418,4 +433,13 @@ public class FeignClientUsingPropertiesTests {
}
public static class NoOpQueryMapEncoder implements QueryMapEncoder {
@Override
public Map<String, Object> encode(Object o) {
return null;
}
}
}

View File

@@ -99,7 +99,7 @@ public class EqualsAndHashCodeAssert {
*/
public static void assertEqualsAndHashCodeConsistency(Object objectOne, Object objectTwo) {
assertThat(objectOne.equals(objectTwo)).isTrue();
assertThat(objectOne.hashCode()).isEqualTo(objectTwo.hashCode());
assertThat(objectOne).hasSameHashCodeAs(objectTwo);
}
}

View File

@@ -9,6 +9,7 @@ feign.client.config.default.errorDecoder=org.springframework.cloud.openfeign.Fei
feign.client.config.default.retryer=org.springframework.cloud.openfeign.FeignClientUsingPropertiesTests.NoRetryer
feign.client.config.default.decode404=true
feign.client.config.default.capabilities=org.springframework.cloud.openfeign.FeignClientUsingPropertiesTests.NoOpCapability
feign.client.config.default.queryMapEncoder=org.springframework.cloud.openfeign.FeignClientUsingPropertiesTests.NoOpQueryMapEncoder
feign.client.config.foo.requestInterceptors[0]=org.springframework.cloud.openfeign.FeignClientUsingPropertiesTests.FooRequestInterceptor
feign.client.config.foo.requestInterceptors[1]=org.springframework.cloud.openfeign.FeignClientUsingPropertiesTests.BarRequestInterceptor
feign.client.config.singleValue.defaultRequestHeaders[singleValueHeaders]=header