diff --git a/docs/modules/ROOT/pages/spring-cloud-openfeign.adoc b/docs/modules/ROOT/pages/spring-cloud-openfeign.adoc index 2bbb4009c..ca907dc37 100644 --- a/docs/modules/ROOT/pages/spring-cloud-openfeign.adoc +++ b/docs/modules/ROOT/pages/spring-cloud-openfeign.adoc @@ -204,7 +204,9 @@ spring: requestInterceptors: - com.example.FooRequestInterceptor - com.example.BarRequestInterceptor - responseInterceptor: com.example.BazResponseInterceptor + responseInterceptors: + - com.example.BazResponseInterceptor + - com.example.QuxResponseInterceptor dismiss404: false encoder: com.example.SimpleEncoder decoder: com.example.SimpleDecoder diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientFactoryBean.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientFactoryBean.java index 5fc73f80e..8ae3cbf2f 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientFactoryBean.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientFactoryBean.java @@ -225,10 +225,14 @@ protected void configureUsingConfiguration(FeignClientFactory context, Feign.Bui AnnotationAwareOrderComparator.sort(interceptors); builder.requestInterceptors(interceptors); } - ResponseInterceptor responseInterceptor = getInheritedAwareOptional(context, ResponseInterceptor.class); - if (responseInterceptor != null) { - builder.responseInterceptor(responseInterceptor); + Map responseInterceptors = getInheritedAwareInstances(context, + ResponseInterceptor.class); + if (responseInterceptors != null) { + List interceptors = new ArrayList<>(responseInterceptors.values()); + AnnotationAwareOrderComparator.sort(interceptors); + builder.responseInterceptors(interceptors); } + QueryMapEncoder queryMapEncoder = getInheritedAwareOptional(context, QueryMapEncoder.class); if (queryMapEncoder != null) { builder.queryMapEncoder(queryMapEncoder); @@ -287,8 +291,12 @@ protected void configureUsingProperties(FeignClientProperties.FeignClientConfigu } } - if (config.getResponseInterceptor() != null) { - builder.responseInterceptor(getOrInstantiate(config.getResponseInterceptor())); + if (config.getResponseInterceptors() != null && !config.getResponseInterceptors().isEmpty()) { + // this will add response interceptor to builder, not replace existing + for (Class bean : config.getResponseInterceptors()) { + ResponseInterceptor interceptor = getOrInstantiate(bean); + builder.responseInterceptor(interceptor); + } } if (config.getDismiss404() != null) { diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientProperties.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientProperties.java index bec1b653a..93f547324 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientProperties.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientProperties.java @@ -128,7 +128,7 @@ public static class FeignClientConfiguration { private List> requestInterceptors; - private Class responseInterceptor; + private List> responseInterceptors; private Map> defaultRequestHeaders = new HashMap<>(); @@ -206,12 +206,12 @@ public void setRequestInterceptors(List> requestInterc this.requestInterceptors = requestInterceptors; } - public Class getResponseInterceptor() { - return responseInterceptor; + public List> getResponseInterceptors() { + return responseInterceptors; } - public void setResponseInterceptor(Class responseInterceptor) { - this.responseInterceptor = responseInterceptor; + public void setResponseInterceptors(List> responseInterceptors) { + this.responseInterceptors = responseInterceptors; } public Map> getDefaultRequestHeaders() { @@ -323,7 +323,7 @@ public boolean equals(Object o) { && Objects.equals(readTimeout, that.readTimeout) && Objects.equals(retryer, that.retryer) && Objects.equals(errorDecoder, that.errorDecoder) && Objects.equals(requestInterceptors, that.requestInterceptors) - && Objects.equals(responseInterceptor, that.responseInterceptor) + && Objects.equals(responseInterceptors, that.responseInterceptors) && Objects.equals(dismiss404, that.dismiss404) && Objects.equals(encoder, that.encoder) && Objects.equals(decoder, that.decoder) && Objects.equals(contract, that.contract) && Objects.equals(exceptionPropagationPolicy, that.exceptionPropagationPolicy) @@ -338,7 +338,7 @@ public boolean equals(Object o) { @Override public int hashCode() { return Objects.hash(loggerLevel, connectTimeout, readTimeout, retryer, errorDecoder, requestInterceptors, - responseInterceptor, dismiss404, encoder, decoder, contract, exceptionPropagationPolicy, + responseInterceptors, dismiss404, encoder, decoder, contract, exceptionPropagationPolicy, defaultQueryParameters, defaultRequestHeaders, capabilities, queryMapEncoder, micrometer, followRedirects, url); } diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignClientConfigurationTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignClientConfigurationTests.java index 004fdd395..00f3770c3 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignClientConfigurationTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignClientConfigurationTests.java @@ -61,7 +61,7 @@ void shouldDefaultToValuesWhenFieldsNotSet() { assertThat(config.getRetryer()).isNull(); assertThat(config.getErrorDecoder()).isNull(); assertThat(config.getRequestInterceptors()).isNull(); - assertThat(config.getResponseInterceptor()).isNull(); + assertThat(config.getResponseInterceptors()).isNull(); assertThat(config.getDefaultRequestHeaders()).isEmpty(); assertThat(config.getDefaultQueryParameters()).isEmpty(); assertThat(config.getDismiss404()).isNull(); @@ -84,8 +84,8 @@ void shouldReturnValuesWhenSet() { config.setErrorDecoder(ErrorDecoder.class); List> requestInterceptors = Lists.list(RequestInterceptor.class); config.setRequestInterceptors(requestInterceptors); - Class responseInterceptor = ResponseInterceptor.class; - config.setResponseInterceptor(responseInterceptor); + List> responseInterceptors = Lists.list(ResponseInterceptor.class); + config.setResponseInterceptors(responseInterceptors); Map> defaultRequestHeaders = Maps.newHashMap("default", Collections.emptyList()); config.setDefaultRequestHeaders(defaultRequestHeaders); Map> defaultQueryParameters = Maps.newHashMap("default", Collections.emptyList()); @@ -107,7 +107,7 @@ void shouldReturnValuesWhenSet() { assertThat(config.getRetryer()).isSameAs(Retryer.class); assertThat(config.getErrorDecoder()).isSameAs(ErrorDecoder.class); assertThat(config.getRequestInterceptors()).isSameAs(requestInterceptors); - assertThat(config.getResponseInterceptor()).isSameAs(responseInterceptor); + assertThat(config.getResponseInterceptors()).isSameAs(responseInterceptors); assertThat(config.getDefaultRequestHeaders()).isSameAs(defaultRequestHeaders); assertThat(config.getDefaultQueryParameters()).isSameAs(defaultQueryParameters); assertThat(config.getDismiss404()).isTrue();