Move Call of applyBuildCustomizers at end of getTarget Method (#674)
This commit is contained in:
@@ -69,6 +69,7 @@ import org.springframework.util.StringUtils;
|
|||||||
* @author Sam Kruglov
|
* @author Sam Kruglov
|
||||||
* @author Jasbir Singh
|
* @author Jasbir Singh
|
||||||
* @author Hyeonmin Park
|
* @author Hyeonmin Park
|
||||||
|
* @author Felix Dittrich
|
||||||
*/
|
*/
|
||||||
public class FeignClientFactoryBean
|
public class FeignClientFactoryBean
|
||||||
implements FactoryBean<Object>, InitializingBean, ApplicationContextAware, BeanFactoryAware {
|
implements FactoryBean<Object>, InitializingBean, ApplicationContextAware, BeanFactoryAware {
|
||||||
@@ -132,7 +133,6 @@ public class FeignClientFactoryBean
|
|||||||
// @formatter:on
|
// @formatter:on
|
||||||
|
|
||||||
configureFeign(context, builder);
|
configureFeign(context, builder);
|
||||||
applyBuildCustomizers(context, builder);
|
|
||||||
|
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
@@ -443,6 +443,9 @@ public class FeignClientFactoryBean
|
|||||||
}
|
}
|
||||||
builder.client(client);
|
builder.client(client);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
applyBuildCustomizers(context, builder);
|
||||||
|
|
||||||
Targeter targeter = get(context, Targeter.class);
|
Targeter targeter = get(context, Targeter.class);
|
||||||
return (T) targeter.target(this, builder, context, new HardCodedTarget<>(type, name, url));
|
return (T) targeter.target(this, builder, context, new HardCodedTarget<>(type, name, url));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,9 +18,12 @@ package org.springframework.cloud.openfeign;
|
|||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
|
|
||||||
|
import feign.Client;
|
||||||
import feign.Feign;
|
import feign.Feign;
|
||||||
import feign.Logger;
|
import feign.Logger;
|
||||||
|
import org.junit.jupiter.api.Assertions;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.mockito.ArgumentCaptor;
|
||||||
|
|
||||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
@@ -30,22 +33,35 @@ import org.springframework.core.annotation.Order;
|
|||||||
import org.springframework.util.ReflectionUtils;
|
import org.springframework.util.ReflectionUtils;
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
|
import static org.mockito.Mockito.doCallRealMethod;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.spy;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Matt King
|
* @author Matt King
|
||||||
* @author Sam Kruglov
|
* @author Sam Kruglov
|
||||||
|
* @author Felix Dittrich
|
||||||
*/
|
*/
|
||||||
class FeignBuilderCustomizerTests {
|
class FeignBuilderCustomizerTests {
|
||||||
|
|
||||||
|
private static final Targeter targeterSpy = spy(DefaultTargeter.class);
|
||||||
|
|
||||||
|
private static final Client defaultClient = mock(Client.class);
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testBuilderCustomizer() {
|
void testBuilderCustomizer() {
|
||||||
|
ArgumentCaptor<Feign.Builder> feignBuilderCaptor = ArgumentCaptor.forClass(Feign.Builder.class);
|
||||||
|
doCallRealMethod().when(targeterSpy).target(any(), feignBuilderCaptor.capture(), any(), any());
|
||||||
|
|
||||||
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
|
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
|
||||||
FeignBuilderCustomizerTests.SampleConfiguration2.class);
|
FeignBuilderCustomizerTests.SampleConfiguration2.class);
|
||||||
|
|
||||||
FeignClientFactoryBean clientFactoryBean = context.getBean(FeignClientFactoryBean.class);
|
FeignClientFactoryBean clientFactoryBean = context.getBean(FeignClientFactoryBean.class);
|
||||||
FeignContext feignContext = context.getBean(FeignContext.class);
|
clientFactoryBean.getTarget();
|
||||||
|
|
||||||
Feign.Builder builder = clientFactoryBean.feign(feignContext);
|
Assertions.assertNotNull(feignBuilderCaptor.getValue());
|
||||||
|
Feign.Builder builder = feignBuilderCaptor.getValue();
|
||||||
assertFeignBuilderField(builder, "logLevel", Logger.Level.HEADERS);
|
assertFeignBuilderField(builder, "logLevel", Logger.Level.HEADERS);
|
||||||
assertFeignBuilderField(builder, "decode404", true);
|
assertFeignBuilderField(builder, "decode404", true);
|
||||||
|
|
||||||
@@ -62,13 +78,17 @@ class FeignBuilderCustomizerTests {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testBuildCustomizerOrdered() {
|
void testBuildCustomizerOrdered() {
|
||||||
|
ArgumentCaptor<Feign.Builder> feignBuilderCaptor = ArgumentCaptor.forClass(Feign.Builder.class);
|
||||||
|
doCallRealMethod().when(targeterSpy).target(any(), feignBuilderCaptor.capture(), any(), any());
|
||||||
|
|
||||||
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
|
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
|
||||||
FeignBuilderCustomizerTests.SampleConfiguration3.class);
|
FeignBuilderCustomizerTests.SampleConfiguration3.class);
|
||||||
|
|
||||||
FeignClientFactoryBean clientFactoryBean = context.getBean(FeignClientFactoryBean.class);
|
FeignClientFactoryBean clientFactoryBean = context.getBean(FeignClientFactoryBean.class);
|
||||||
FeignContext feignContext = context.getBean(FeignContext.class);
|
clientFactoryBean.getTarget();
|
||||||
|
|
||||||
Feign.Builder builder = clientFactoryBean.feign(feignContext);
|
Assertions.assertNotNull(feignBuilderCaptor.getValue());
|
||||||
|
Feign.Builder builder = feignBuilderCaptor.getValue();
|
||||||
assertFeignBuilderField(builder, "logLevel", Logger.Level.FULL);
|
assertFeignBuilderField(builder, "logLevel", Logger.Level.FULL);
|
||||||
assertFeignBuilderField(builder, "decode404", true);
|
assertFeignBuilderField(builder, "decode404", true);
|
||||||
|
|
||||||
@@ -77,15 +97,19 @@ class FeignBuilderCustomizerTests {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testBuildCustomizerOrderedWithAdditional() {
|
void testBuildCustomizerOrderedWithAdditional() {
|
||||||
|
ArgumentCaptor<Feign.Builder> feignBuilderCaptor = ArgumentCaptor.forClass(Feign.Builder.class);
|
||||||
|
doCallRealMethod().when(targeterSpy).target(any(), feignBuilderCaptor.capture(), any(), any());
|
||||||
|
|
||||||
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
|
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
|
||||||
FeignBuilderCustomizerTests.SampleConfiguration3.class);
|
FeignBuilderCustomizerTests.SampleConfiguration3.class);
|
||||||
|
|
||||||
FeignClientFactoryBean clientFactoryBean = context.getBean(FeignClientFactoryBean.class);
|
FeignClientFactoryBean clientFactoryBean = context.getBean(FeignClientFactoryBean.class);
|
||||||
clientFactoryBean.addCustomizer(builder -> builder.logLevel(Logger.Level.BASIC));
|
clientFactoryBean.addCustomizer(builder -> builder.logLevel(Logger.Level.BASIC));
|
||||||
clientFactoryBean.addCustomizer(Feign.Builder::doNotCloseAfterDecode);
|
clientFactoryBean.addCustomizer(Feign.Builder::doNotCloseAfterDecode);
|
||||||
FeignContext feignContext = context.getBean(FeignContext.class);
|
clientFactoryBean.getTarget();
|
||||||
|
|
||||||
Feign.Builder builder = clientFactoryBean.feign(feignContext);
|
Assertions.assertNotNull(feignBuilderCaptor.getValue());
|
||||||
|
Feign.Builder builder = feignBuilderCaptor.getValue();
|
||||||
assertFeignBuilderField(builder, "logLevel", Logger.Level.BASIC);
|
assertFeignBuilderField(builder, "logLevel", Logger.Level.BASIC);
|
||||||
assertFeignBuilderField(builder, "decode404", true);
|
assertFeignBuilderField(builder, "decode404", true);
|
||||||
assertFeignBuilderField(builder, "closeAfterDecode", false);
|
assertFeignBuilderField(builder, "closeAfterDecode", false);
|
||||||
@@ -93,6 +117,26 @@ class FeignBuilderCustomizerTests {
|
|||||||
context.close();
|
context.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testBuildCustomizerWithCustomHttpClient() {
|
||||||
|
ArgumentCaptor<Feign.Builder> feignBuilderCaptor = ArgumentCaptor.forClass(Feign.Builder.class);
|
||||||
|
doCallRealMethod().when(targeterSpy).target(any(), feignBuilderCaptor.capture(), any(), any());
|
||||||
|
|
||||||
|
Client customClientMock = mock(Client.class);
|
||||||
|
|
||||||
|
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
|
||||||
|
FeignBuilderCustomizerTests.SampleConfiguration3.class);
|
||||||
|
FeignClientFactoryBean clientFactoryBean = context.getBean(FeignClientFactoryBean.class);
|
||||||
|
clientFactoryBean.addCustomizer(builder -> builder.client(customClientMock));
|
||||||
|
clientFactoryBean.getTarget();
|
||||||
|
|
||||||
|
Assertions.assertNotNull(feignBuilderCaptor.getValue());
|
||||||
|
Feign.Builder builder = feignBuilderCaptor.getValue();
|
||||||
|
assertFeignBuilderField(builder, "client", customClientMock);
|
||||||
|
|
||||||
|
context.close();
|
||||||
|
}
|
||||||
|
|
||||||
private static FeignClientFactoryBean defaultFeignClientFactoryBean() {
|
private static FeignClientFactoryBean defaultFeignClientFactoryBean() {
|
||||||
FeignClientFactoryBean feignClientFactoryBean = new FeignClientFactoryBean();
|
FeignClientFactoryBean feignClientFactoryBean = new FeignClientFactoryBean();
|
||||||
feignClientFactoryBean.setContextId("test");
|
feignClientFactoryBean.setContextId("test");
|
||||||
@@ -132,6 +176,11 @@ class FeignBuilderCustomizerTests {
|
|||||||
return defaultFeignClientFactoryBean();
|
return defaultFeignClientFactoryBean();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
Targeter targeter() {
|
||||||
|
return targeterSpy;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Configuration(proxyBeanMethods = false)
|
@Configuration(proxyBeanMethods = false)
|
||||||
@@ -170,6 +219,16 @@ class FeignBuilderCustomizerTests {
|
|||||||
return defaultFeignClientFactoryBean();
|
return defaultFeignClientFactoryBean();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
Targeter targeter() {
|
||||||
|
return targeterSpy;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
Client client() {
|
||||||
|
return defaultClient;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user