diff --git a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/FeignComponentProvider.java b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/FeignComponentProvider.java
deleted file mode 100644
index 3b204d5..0000000
--- a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/FeignComponentProvider.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package io.microsphere.spring.cloud.openfeign;
-
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.BeanFactory;
-import org.springframework.beans.factory.BeanFactoryAware;
-import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
-import org.springframework.cloud.context.named.NamedContextFactory;
-import org.springframework.cloud.openfeign.FeignClientSpecification;
-
-/**
- * @author 韩超
- * @since 0.0.1
- */
-public class FeignComponentProvider implements BeanFactoryAware {
-
- private final NamedContextFactory contextFactory;
-
- private BeanFactory mainBeanFactory;
-
- public FeignComponentProvider(NamedContextFactory contextFactory) {
- this.contextFactory = contextFactory;
- }
-
- public T getInstance(String contextName, Class type) {
- T component = this.contextFactory.getInstance(contextName, type);
- if (component == null && mainBeanFactory instanceof AutowireCapableBeanFactory) {
- //create new
- return ((AutowireCapableBeanFactory)this.mainBeanFactory).createBean(type);
- }
- return component;
- }
-
- @Override
- public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
- this.mainBeanFactory = beanFactory;
- }
-}
diff --git a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/autoconfigure/FeignClientAutoRefreshAutoConfiguration.java b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/autoconfigure/FeignClientAutoRefreshAutoConfiguration.java
index bc01cd1..6eacb45 100644
--- a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/autoconfigure/FeignClientAutoRefreshAutoConfiguration.java
+++ b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/autoconfigure/FeignClientAutoRefreshAutoConfiguration.java
@@ -1,6 +1,5 @@
package io.microsphere.spring.cloud.openfeign.autoconfigure;
-import io.microsphere.spring.cloud.openfeign.FeignComponentProvider;
import io.microsphere.spring.cloud.openfeign.autorefresh.FeignClientConfigurationChangedListener;
import io.microsphere.spring.cloud.openfeign.autorefresh.FeignComponentRegistry;
import io.microsphere.spring.cloud.openfeign.components.NoOpRequestInterceptor;
@@ -10,7 +9,6 @@
import org.springframework.cloud.context.named.NamedContextFactory;
import org.springframework.cloud.openfeign.FeignBuilderCustomizer;
import org.springframework.cloud.openfeign.FeignClientProperties;
-import org.springframework.cloud.openfeign.FeignClientSpecification;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.event.EventListener;
@@ -51,11 +49,6 @@ public FeignClientSpecificationPostProcessor feignClientSpecificationPostProcess
return new FeignClientSpecificationPostProcessor();
}
- @Bean
- public FeignComponentProvider feignComponentProvider(NamedContextFactory contextFactory) {
- return new FeignComponentProvider(contextFactory);
- }
-
private void registerFeignClientConfigurationChangedListener(ApplicationReadyEvent event) {
ConfigurableApplicationContext context = event.getApplicationContext();
FeignComponentRegistry feignComponentRegistry = context.getBean(FeignComponentRegistry.class);
diff --git a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/autorefresh/AutoRefreshCapability.java b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/autorefresh/AutoRefreshCapability.java
index 884c00a..9fe6808 100644
--- a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/autorefresh/AutoRefreshCapability.java
+++ b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/autorefresh/AutoRefreshCapability.java
@@ -1,23 +1,14 @@
package io.microsphere.spring.cloud.openfeign.autorefresh;
-import feign.Capability;
-import feign.Contract;
-import feign.QueryMapEncoder;
-import feign.RequestInterceptor;
-import feign.Retryer;
+import feign.*;
import feign.codec.Decoder;
import feign.codec.Encoder;
import feign.codec.ErrorDecoder;
-import io.microsphere.spring.cloud.openfeign.FeignComponentProvider;
-import io.microsphere.spring.cloud.openfeign.components.DecoratedContract;
-import io.microsphere.spring.cloud.openfeign.components.DecoratedDecoder;
-import io.microsphere.spring.cloud.openfeign.components.DecoratedEncoder;
-import io.microsphere.spring.cloud.openfeign.components.DecoratedErrorDecoder;
-import io.microsphere.spring.cloud.openfeign.components.DecoratedFeignComponent;
-import io.microsphere.spring.cloud.openfeign.components.DecoratedQueryMapEncoder;
-import io.microsphere.spring.cloud.openfeign.components.DecoratedRetryer;
+import io.microsphere.spring.cloud.openfeign.components.*;
import org.springframework.beans.BeansException;
+import org.springframework.cloud.context.named.NamedContextFactory;
import org.springframework.cloud.openfeign.FeignClientProperties;
+import org.springframework.cloud.openfeign.FeignClientSpecification;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
@@ -29,15 +20,15 @@ public class AutoRefreshCapability implements Capability, ApplicationContextAwar
private final FeignComponentRegistry componentRegistry;
//private final FeignClientFactory feignClientFactory;
- private final FeignComponentProvider componentProvider;
+ private final NamedContextFactory contextFactory;
private final FeignClientProperties clientProperties;
private String contextId;
- public AutoRefreshCapability(FeignClientProperties clientProperties, FeignComponentProvider componentProvider, FeignComponentRegistry componentRegistry) {
+ public AutoRefreshCapability(FeignClientProperties clientProperties, NamedContextFactory contextFactory, FeignComponentRegistry componentRegistry) {
this.clientProperties = clientProperties;
- this.componentProvider = componentProvider;
+ this.contextFactory = contextFactory;
this.componentRegistry = componentRegistry;
}
@@ -53,7 +44,7 @@ public Retryer enrich(Retryer retryer) {
return null;
DecoratedRetryer decoratedRetryer = DecoratedFeignComponent.instantiate(DecoratedRetryer.class, Retryer.class,
- contextId, componentProvider, clientProperties, retryer);
+ contextId, contextFactory, clientProperties, retryer);
this.componentRegistry.register(contextId, decoratedRetryer);
return decoratedRetryer;
@@ -65,7 +56,7 @@ public Contract enrich(Contract contract) {
return null;
DecoratedContract decoratedContract = DecoratedFeignComponent.instantiate(DecoratedContract.class, Contract.class,
- contextId, componentProvider, clientProperties, contract);
+ contextId, contextFactory, clientProperties, contract);
this.componentRegistry.register(contextId, decoratedContract);
return decoratedContract;
}
@@ -76,7 +67,7 @@ public Decoder enrich(Decoder decoder) {
return null;
DecoratedDecoder decoratedDecoder = DecoratedFeignComponent.instantiate(DecoratedDecoder.class, Decoder.class,
- contextId, componentProvider, clientProperties, decoder);
+ contextId, contextFactory, clientProperties, decoder);
this.componentRegistry.register(contextId, decoratedDecoder);
return decoratedDecoder;
}
@@ -87,7 +78,7 @@ public Encoder enrich(Encoder encoder) {
return null;
DecoratedEncoder decoratedEncoder = DecoratedFeignComponent.instantiate(DecoratedEncoder.class, Encoder.class,
- contextId, componentProvider, clientProperties, encoder);
+ contextId, contextFactory, clientProperties, encoder);
this.componentRegistry.register(contextId, decoratedEncoder);
return decoratedEncoder;
}
@@ -97,7 +88,7 @@ public ErrorDecoder enrich(ErrorDecoder decoder) {
return null;
DecoratedErrorDecoder decoratedErrorDecoder = DecoratedFeignComponent.instantiate(DecoratedErrorDecoder.class, ErrorDecoder.class,
- contextId, componentProvider, clientProperties, decoder);
+ contextId, contextFactory, clientProperties, decoder);
this.componentRegistry.register(contextId, decoratedErrorDecoder);
return decoratedErrorDecoder;
}
@@ -113,7 +104,7 @@ public QueryMapEncoder enrich(QueryMapEncoder queryMapEncoder) {
return null;
DecoratedQueryMapEncoder decoratedQueryMapEncoder = DecoratedFeignComponent.instantiate(DecoratedQueryMapEncoder.class, QueryMapEncoder.class,
- contextId, componentProvider, clientProperties, queryMapEncoder);
+ contextId, contextFactory, clientProperties, queryMapEncoder);
this.componentRegistry.register(contextId, decoratedQueryMapEncoder);
return decoratedQueryMapEncoder;
diff --git a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/CompositedRequestInterceptor.java b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/CompositedRequestInterceptor.java
index 4cb3cf9..d7237a9 100644
--- a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/CompositedRequestInterceptor.java
+++ b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/CompositedRequestInterceptor.java
@@ -7,11 +7,7 @@
import org.springframework.cloud.openfeign.FeignClientProperties;
import org.springframework.util.CollectionUtils;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
/**
* @author 韩超
@@ -29,6 +25,10 @@ public CompositedRequestInterceptor(String contextId, BeanFactory beanFactory) {
this.contextId = contextId;
}
+ public Set getRequestInterceptors() {
+ return Collections.unmodifiableSet(set);
+ }
+
@Override
public void apply(RequestTemplate template) {
diff --git a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedContract.java b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedContract.java
index 05eee3d..025ef5f 100644
--- a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedContract.java
+++ b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedContract.java
@@ -2,8 +2,9 @@
import feign.Contract;
import feign.MethodMetadata;
-import io.microsphere.spring.cloud.openfeign.FeignComponentProvider;
+import org.springframework.cloud.context.named.NamedContextFactory;
import org.springframework.cloud.openfeign.FeignClientProperties;
+import org.springframework.cloud.openfeign.FeignClientSpecification;
import java.util.List;
@@ -13,8 +14,8 @@
*/
public class DecoratedContract extends DecoratedFeignComponent implements Contract {
- public DecoratedContract(String contextId, FeignComponentProvider feignComponentProvider, FeignClientProperties clientProperties, Contract delegate) {
- super(contextId, feignComponentProvider, clientProperties, delegate);
+ public DecoratedContract(String contextId, NamedContextFactory contextFactory, FeignClientProperties clientProperties, Contract delegate) {
+ super(contextId, contextFactory, clientProperties, delegate);
}
@Override
diff --git a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedDecoder.java b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedDecoder.java
index 91da63d..afcb0ae 100644
--- a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedDecoder.java
+++ b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedDecoder.java
@@ -4,8 +4,9 @@
import feign.Response;
import feign.codec.DecodeException;
import feign.codec.Decoder;
-import io.microsphere.spring.cloud.openfeign.FeignComponentProvider;
+import org.springframework.cloud.context.named.NamedContextFactory;
import org.springframework.cloud.openfeign.FeignClientProperties;
+import org.springframework.cloud.openfeign.FeignClientSpecification;
import java.io.IOException;
import java.lang.reflect.Type;
@@ -16,8 +17,8 @@
*/
public class DecoratedDecoder extends DecoratedFeignComponent implements Decoder {
- public DecoratedDecoder(String contextId, FeignComponentProvider feignComponentProvider, FeignClientProperties clientProperties, Decoder delegate) {
- super(contextId, feignComponentProvider, clientProperties, delegate);
+ public DecoratedDecoder(String contextId, NamedContextFactory contextFactory, FeignClientProperties clientProperties, Decoder delegate) {
+ super(contextId, contextFactory, clientProperties, delegate);
}
@Override
diff --git a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedEncoder.java b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedEncoder.java
index 3ef7a3b..951e6ca 100644
--- a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedEncoder.java
+++ b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedEncoder.java
@@ -3,8 +3,9 @@
import feign.RequestTemplate;
import feign.codec.EncodeException;
import feign.codec.Encoder;
-import io.microsphere.spring.cloud.openfeign.FeignComponentProvider;
+import org.springframework.cloud.context.named.NamedContextFactory;
import org.springframework.cloud.openfeign.FeignClientProperties;
+import org.springframework.cloud.openfeign.FeignClientSpecification;
import java.lang.reflect.Type;
@@ -14,8 +15,8 @@
*/
public class DecoratedEncoder extends DecoratedFeignComponent implements Encoder {
- public DecoratedEncoder(String contextId, FeignComponentProvider feignComponentProvider, FeignClientProperties clientProperties, Encoder delegate) {
- super(contextId, feignComponentProvider, clientProperties, delegate);
+ public DecoratedEncoder(String contextId, NamedContextFactory contextFactory, FeignClientProperties clientProperties, Encoder delegate) {
+ super(contextId, contextFactory, clientProperties, delegate);
}
@Override
diff --git a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedErrorDecoder.java b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedErrorDecoder.java
index 9876660..c9c97d7 100644
--- a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedErrorDecoder.java
+++ b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedErrorDecoder.java
@@ -2,8 +2,9 @@
import feign.Response;
import feign.codec.ErrorDecoder;
-import io.microsphere.spring.cloud.openfeign.FeignComponentProvider;
+import org.springframework.cloud.context.named.NamedContextFactory;
import org.springframework.cloud.openfeign.FeignClientProperties;
+import org.springframework.cloud.openfeign.FeignClientSpecification;
/**
* @author 韩超
@@ -11,8 +12,8 @@
*/
public class DecoratedErrorDecoder extends DecoratedFeignComponent implements ErrorDecoder {
- public DecoratedErrorDecoder(String contextId, FeignComponentProvider feignComponentProvider, FeignClientProperties clientProperties, ErrorDecoder delegate) {
- super(contextId, feignComponentProvider, clientProperties, delegate);
+ public DecoratedErrorDecoder(String contextId, NamedContextFactory contextFactory, FeignClientProperties clientProperties, ErrorDecoder delegate) {
+ super(contextId, contextFactory, clientProperties, delegate);
}
@Override
diff --git a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedFeignComponent.java b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedFeignComponent.java
index aeb65b6..0995f2c 100644
--- a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedFeignComponent.java
+++ b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedFeignComponent.java
@@ -1,11 +1,12 @@
package io.microsphere.spring.cloud.openfeign.components;
-import io.microsphere.spring.cloud.openfeign.FeignComponentProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanInstantiationException;
import org.springframework.beans.BeanUtils;
+import org.springframework.cloud.context.named.NamedContextFactory;
import org.springframework.cloud.openfeign.FeignClientProperties;
+import org.springframework.cloud.openfeign.FeignClientSpecification;
import org.springframework.lang.NonNull;
import java.lang.reflect.Constructor;
@@ -20,7 +21,7 @@ public abstract class DecoratedFeignComponent implements Refreshable {
private final Logger log = LoggerFactory.getLogger(getClass());
//private final FeignClientFactory feignClientFactory;
- private final FeignComponentProvider componentProvider;
+ private final NamedContextFactory contextFactory;
private final String contextId;
private final FeignClientProperties clientProperties;
@@ -33,9 +34,9 @@ public abstract class DecoratedFeignComponent implements Refreshable {
private final ReentrantReadWriteLock.ReadLock readLock = lock.readLock();
private final ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock();
- public DecoratedFeignComponent(String contextId, FeignComponentProvider feignComponentProvider, FeignClientProperties clientProperties, T delegate) {
+ public DecoratedFeignComponent(String contextId, NamedContextFactory contextFactory, FeignClientProperties clientProperties, T delegate) {
this.contextId = contextId;
- this.componentProvider = feignComponentProvider;
+ this.contextFactory = contextFactory;
this.clientProperties = clientProperties;
this.delegate = delegate;
}
@@ -53,9 +54,12 @@ public T delegate() {
}
@NonNull
- public FeignComponentProvider getFeignComponentProvider() {
- return this.componentProvider;
- };
+ public T loadInstanceFromContextFactory(String contextId, Class componentType) {
+ T component = this.contextFactory.getInstance(contextId, componentType);
+ if (component == null)
+ return this.contextFactory.getParent().getAutowireCapableBeanFactory().createBean(componentType);
+ return component;
+ }
@NonNull
public String contextId() {
@@ -84,9 +88,7 @@ protected T loadInstance() {
String contextId = contextId();
writeLock.lock();
try {
- T component = getFeignComponentProvider().getInstance(contextId, componentType);
- if (component == null)
- component = BeanUtils.instantiateClass(componentType);
+ T component = loadInstanceFromContextFactory(contextId, componentType);
this.delegate = component;
return component;
} catch (Throwable ex) {
@@ -113,10 +115,10 @@ public String toString() {
}
public static , T> W instantiate(Class decoratedClass, Class componentClass,
- String contextId, FeignComponentProvider feignComponentProvider, FeignClientProperties clientProperties, T delegate) {
+ String contextId, NamedContextFactory contextFactory, FeignClientProperties clientProperties, T delegate) {
try {
- Constructor constructor = decoratedClass.getConstructor(String.class, FeignComponentProvider.class, FeignClientProperties.class, componentClass);
- return BeanUtils.instantiateClass(constructor, contextId, feignComponentProvider, clientProperties, delegate);
+ Constructor constructor = decoratedClass.getConstructor(String.class, NamedContextFactory.class, FeignClientProperties.class, componentClass);
+ return BeanUtils.instantiateClass(constructor, contextId, contextFactory, clientProperties, delegate);
} catch (NoSuchMethodException noSuchMethodException) {
throw new BeanInstantiationException(decoratedClass, noSuchMethodException.getLocalizedMessage());
}
diff --git a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedQueryMapEncoder.java b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedQueryMapEncoder.java
index 6e4d941..c40c140 100644
--- a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedQueryMapEncoder.java
+++ b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedQueryMapEncoder.java
@@ -2,8 +2,9 @@
import feign.QueryMapEncoder;
import io.microsphere.logging.Logger;
-import io.microsphere.spring.cloud.openfeign.FeignComponentProvider;
+import org.springframework.cloud.context.named.NamedContextFactory;
import org.springframework.cloud.openfeign.FeignClientProperties;
+import org.springframework.cloud.openfeign.FeignClientSpecification;
import java.lang.invoke.MethodHandle;
import java.util.Map;
@@ -23,8 +24,8 @@ public class DecoratedQueryMapEncoder extends DecoratedFeignComponent contextFactory, FeignClientProperties clientProperties, QueryMapEncoder delegate) {
+ super(contextId, contextFactory, clientProperties, delegate);
}
@Override
diff --git a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedRetryer.java b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedRetryer.java
index 1e5dd59..3d1cb2c 100644
--- a/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedRetryer.java
+++ b/microsphere-spring-cloud-openfeign/src/main/java/io/microsphere/spring/cloud/openfeign/components/DecoratedRetryer.java
@@ -2,8 +2,9 @@
import feign.RetryableException;
import feign.Retryer;
-import io.microsphere.spring.cloud.openfeign.FeignComponentProvider;
+import org.springframework.cloud.context.named.NamedContextFactory;
import org.springframework.cloud.openfeign.FeignClientProperties;
+import org.springframework.cloud.openfeign.FeignClientSpecification;
/**
* @author 韩超
@@ -11,8 +12,8 @@
*/
public class DecoratedRetryer extends DecoratedFeignComponent implements Retryer {
- public DecoratedRetryer(String contextId, FeignComponentProvider feignComponentProvider, FeignClientProperties clientProperties, Retryer delegate) {
- super(contextId, feignComponentProvider, clientProperties, delegate);
+ public DecoratedRetryer(String contextId, NamedContextFactory contextFactory, FeignClientProperties clientProperties, Retryer delegate) {
+ super(contextId, contextFactory, clientProperties, delegate);
}
@Override
diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/BaseClient.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/BaseClient.java
index 3a4edcf..47de7f4 100644
--- a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/BaseClient.java
+++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/BaseClient.java
@@ -9,7 +9,7 @@
* @author 韩超
* @since 0.0.1
*/
-@FeignClient(contextId = "my-client", name = "my-client")
+@FeignClient(contextId = "my-client", name = "my-client", configuration = {MockCapability.class})
public interface BaseClient {
@GetMapping("echo")
diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/BaseTest.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/BaseTest.java
index c21b1f6..6f7a3d7 100644
--- a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/BaseTest.java
+++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/BaseTest.java
@@ -1,6 +1,8 @@
package io.microsphere.spring.cloud.openfeign;
import io.microsphere.spring.cloud.openfeign.autoconfigure.EnableFeignAutoRefresh;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -28,6 +30,10 @@
@TestPropertySource(properties = {
"spring.main.allow-bean-definition-overriding=true",
"spring.cloud.openfeign.client.config.default.encoder=io.microsphere.spring.cloud.openfeign.encoder.AEncoder",
+ "spring.cloud.openfeign.client.config.default.error-decoder=io.microsphere.spring.cloud.openfeign.errordecoder.AErrorDecoder",
+ "spring.cloud.openfeign.client.config.default.query-map-encoder=io.microsphere.spring.cloud.openfeign.querymapencoder.AQueryMapEncoder",
+ "spring.cloud.openfeign.client.config.default.retryer=io.microsphere.spring.cloud.openfeign.retryer.ARetry",
+ "spring.cloud.openfeign.client.config.default.decoder=io.microsphere.spring.cloud.openfeign.decoder.ADecoder",
"spring.cloud.openfeign.client.config.default.request-interceptors[0]=io.microsphere.spring.cloud.openfeign.requestInterceptor.ARequestInterceptor",
"spring.cloud.openfeign.client.config.default.default-request-headers.app=my-app",
"spring.cloud.openfeign.client.config.default.default-query-parameters.sign=my-sign",
@@ -46,7 +52,9 @@ public abstract class BaseTest {
private BaseClient client;
protected abstract String afterTestComponentConfigKey();
+ protected abstract Class extends T> beforeTestComponentClass();
protected abstract Class extends T> afterTestComponent();
+ protected abstract FeignComponentAssert loadFeignComponentAssert();
public void replaceConfig() {
final String key = afterTestComponentConfigKey();
@@ -67,19 +75,21 @@ public void replaceConfig() {
@Test
public void testInternal() {
+ ObservableFeignInvocationHandler.componentAssert = loadFeignComponentAssert();
+
+ ObservableFeignInvocationHandler.expectComponentClass = beforeTestComponentClass();
try {
this.client.echo("hello", "1.0");
} catch (Exception ignored) {
-
}
replaceConfig();
+
+ ObservableFeignInvocationHandler.expectComponentClass = afterTestComponent();
try {
this.client.echo("world", "1.0");
} catch (Exception ignored) {
}
-
-
}
protected void triggerRefreshEvent() {
diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/FeignComponentAssert.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/FeignComponentAssert.java
new file mode 100644
index 0000000..57f56d8
--- /dev/null
+++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/FeignComponentAssert.java
@@ -0,0 +1,19 @@
+package io.microsphere.spring.cloud.openfeign;
+
+import feign.ResponseHandler;
+
+/**
+ * @author 韩超
+ * @since 0.0.1
+ */
+public abstract class FeignComponentAssert {
+
+
+ protected abstract T loadCurrentComponent(Object configuration, ResponseHandler responseHandler) throws Exception;
+
+ public boolean expect(Object configuration, ResponseHandler responseHandler, Class expectedClass) throws Exception {
+ T component = loadCurrentComponent(configuration, responseHandler);
+ return expectedClass.equals(component.getClass());
+ }
+
+}
diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/MockCapability.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/MockCapability.java
new file mode 100644
index 0000000..53562b7
--- /dev/null
+++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/MockCapability.java
@@ -0,0 +1,18 @@
+package io.microsphere.spring.cloud.openfeign;
+
+import feign.Capability;
+import feign.InvocationHandlerFactory;
+
+/**
+ * @author 韩超
+ * @since 0.0.1
+ */
+public class MockCapability implements Capability {
+
+ @Override
+ public InvocationHandlerFactory enrich(InvocationHandlerFactory invocationHandlerFactory) {
+ return ObservableFeignInvocationHandler::new;
+ }
+
+
+}
diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/ObservableFeignInvocationHandler.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/ObservableFeignInvocationHandler.java
new file mode 100644
index 0000000..b23280b
--- /dev/null
+++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/ObservableFeignInvocationHandler.java
@@ -0,0 +1,101 @@
+package io.microsphere.spring.cloud.openfeign;
+
+import feign.InvocationHandlerFactory;
+import feign.ResponseHandler;
+import feign.Target;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.Assert;
+import org.springframework.util.ClassUtils;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.util.Map;
+
+import static feign.Util.checkNotNull;
+
+/**
+ * @author 韩超
+ * @since 0.0.1
+ */
+public class ObservableFeignInvocationHandler implements InvocationHandler {
+
+
+ private static final Logger log = LoggerFactory.getLogger(ObservableFeignInvocationHandler.class);
+ public static FeignComponentAssert> componentAssert;
+ public static Class expectComponentClass;
+
+ private final Target target;
+ private final Map dispatch;
+
+ ObservableFeignInvocationHandler(Target target, Map dispatch) {
+ this.target = checkNotNull(target, "target");
+ this.dispatch = checkNotNull(dispatch, "dispatch for %s", target);
+ }
+
+ @Override
+ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ if ("equals".equals(method.getName())) {
+ try {
+ Object otherHandler =
+ args.length > 0 && args[0] != null ? Proxy.getInvocationHandler(args[0]) : null;
+ return equals(otherHandler);
+ } catch (IllegalArgumentException e) {
+ return false;
+ }
+ } else if ("hashCode".equals(method.getName())) {
+ return hashCode();
+ } else if ("toString".equals(method.getName())) {
+ return toString();
+ } else if (!dispatch.containsKey(method)) {
+ throw new UnsupportedOperationException(
+ String.format("Method \"%s\" should not be called", method.getName()));
+ }
+
+ InvocationHandlerFactory.MethodHandler methodHandler = dispatch.get(method);
+ Object methodHandlerConfiguration = loadMethodHandlerConfiguration(methodHandler);
+ ResponseHandler responseHandler = loadResponseHandler(methodHandler);
+ Assert.isTrue(componentAssert.expect(methodHandlerConfiguration, responseHandler, expectComponentClass), "unexpected component");
+ log.info("component validation is True");
+ return dispatch.get(method).invoke(args);
+ }
+
+ protected Object loadMethodHandlerConfiguration(InvocationHandlerFactory.MethodHandler methodHandler) throws Exception {
+ if (ClassUtils.isPresent("feign.MethodHandlerConfiguration", ObservableFeignInvocationHandler.class.getClassLoader())) {
+ Class> configurationType = methodHandler.getClass();
+ Field field = configurationType.getDeclaredField("methodHandlerConfiguration");
+ field.setAccessible(true);
+ return field.get(methodHandler);
+ }
+ return methodHandler;
+
+ }
+
+ protected ResponseHandler loadResponseHandler(InvocationHandlerFactory.MethodHandler methodHandler) throws Exception {
+ Class> configurationType = methodHandler.getClass();
+ Field field = configurationType.getDeclaredField("responseHandler");
+ field.setAccessible(true);
+ return (ResponseHandler) field.get(methodHandler);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof ObservableFeignInvocationHandler) {
+ ObservableFeignInvocationHandler other = (ObservableFeignInvocationHandler) obj;
+ return target.equals(other.target);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return target.hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return target.toString();
+ }
+}
diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/decoder/ADecoder.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/decoder/ADecoder.java
new file mode 100644
index 0000000..14b8535
--- /dev/null
+++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/decoder/ADecoder.java
@@ -0,0 +1,21 @@
+package io.microsphere.spring.cloud.openfeign.decoder;
+
+import feign.FeignException;
+import feign.Response;
+import feign.codec.DecodeException;
+import feign.codec.Decoder;
+
+import java.io.IOException;
+import java.lang.reflect.Type;
+
+/**
+ * @author 韩超
+ * @since 0.0.1
+ */
+public class ADecoder implements Decoder {
+
+ @Override
+ public Object decode(Response response, Type type) throws IOException, DecodeException, FeignException {
+ return null;
+ }
+}
diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/decoder/BDecoder.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/decoder/BDecoder.java
new file mode 100644
index 0000000..7762fe7
--- /dev/null
+++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/decoder/BDecoder.java
@@ -0,0 +1,21 @@
+package io.microsphere.spring.cloud.openfeign.decoder;
+
+import feign.FeignException;
+import feign.Response;
+import feign.codec.DecodeException;
+import feign.codec.Decoder;
+
+import java.io.IOException;
+import java.lang.reflect.Type;
+
+/**
+ * @author 韩超
+ * @since 0.0.1
+ */
+public class BDecoder implements Decoder {
+
+ @Override
+ public Object decode(Response response, Type type) throws IOException, DecodeException, FeignException {
+ return null;
+ }
+}
diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/decoder/DecoderChangedTest.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/decoder/DecoderChangedTest.java
new file mode 100644
index 0000000..bbbb810
--- /dev/null
+++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/decoder/DecoderChangedTest.java
@@ -0,0 +1,36 @@
+package io.microsphere.spring.cloud.openfeign.decoder;
+
+import feign.codec.Decoder;
+import io.microsphere.spring.cloud.openfeign.BaseTest;
+import io.microsphere.spring.cloud.openfeign.FeignComponentAssert;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+
+/**
+ * @author 韩超
+ * @since 0.0.1
+ */
+@SpringBootTest(classes = DecoderChangedTest.class)
+@EnableAutoConfiguration
+public class DecoderChangedTest extends BaseTest {
+
+ @Override
+ protected String afterTestComponentConfigKey() {
+ return "spring.cloud.openfeign.client.config.my-client.decoder";
+ }
+
+ @Override
+ protected Class extends Decoder> beforeTestComponentClass() {
+ return ADecoder.class;
+ }
+
+ @Override
+ protected Class extends Decoder> afterTestComponent() {
+ return BDecoder.class;
+ }
+
+ @Override
+ protected FeignComponentAssert loadFeignComponentAssert() {
+ return new DecoderComponentAssert();
+ }
+}
diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/decoder/DecoderComponentAssert.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/decoder/DecoderComponentAssert.java
new file mode 100644
index 0000000..c43b0c4
--- /dev/null
+++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/decoder/DecoderComponentAssert.java
@@ -0,0 +1,24 @@
+package io.microsphere.spring.cloud.openfeign.decoder;
+
+import feign.ResponseHandler;
+import feign.codec.Decoder;
+import io.microsphere.spring.cloud.openfeign.FeignComponentAssert;
+import io.microsphere.spring.cloud.openfeign.components.DecoratedDecoder;
+
+import java.lang.reflect.Field;
+
+/**
+ * @author 韩超
+ * @since 0.0.1
+ */
+public class DecoderComponentAssert extends FeignComponentAssert {
+
+ @Override
+ protected Decoder loadCurrentComponent(Object configuration, ResponseHandler responseHandler) throws Exception {
+ Class responseHandlerClass = ResponseHandler.class;
+ Field decoderField = responseHandlerClass.getDeclaredField("decoder");
+ decoderField.setAccessible(true);
+ DecoratedDecoder decoder = (DecoratedDecoder)decoderField.get(responseHandler);
+ return decoder.delegate();
+ }
+}
diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/encoder/AEncoder.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/encoder/AEncoder.java
index a9883ba..23abbb8 100644
--- a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/encoder/AEncoder.java
+++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/encoder/AEncoder.java
@@ -14,7 +14,6 @@ public class AEncoder implements Encoder {
@Override
public void encode(Object object, Type bodyType, RequestTemplate template) throws EncodeException {
- System.out.println("AEncoder is working...");
template.body(object.toString());
}
}
diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/encoder/BEncoder.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/encoder/BEncoder.java
index 302c04e..1d3300d 100644
--- a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/encoder/BEncoder.java
+++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/encoder/BEncoder.java
@@ -14,7 +14,6 @@ public class BEncoder implements Encoder {
@Override
public void encode(Object object, Type bodyType, RequestTemplate template) throws EncodeException {
- System.out.println("BEncoder is working...");
template.body(object.toString());
}
}
diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/encoder/EncoderChangedTest.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/encoder/EncoderChangedTest.java
index 7989641..1229021 100644
--- a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/encoder/EncoderChangedTest.java
+++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/encoder/EncoderChangedTest.java
@@ -2,6 +2,7 @@
import feign.codec.Encoder;
import io.microsphere.spring.cloud.openfeign.BaseTest;
+import io.microsphere.spring.cloud.openfeign.FeignComponentAssert;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
@@ -13,6 +14,17 @@
@EnableAutoConfiguration
public class EncoderChangedTest extends BaseTest {
+
+ @Override
+ protected Class extends Encoder> beforeTestComponentClass() {
+ return AEncoder.class;
+ }
+
+ @Override
+ protected FeignComponentAssert loadFeignComponentAssert() {
+ return EncoderComponentAssert.INSTANCE;
+ }
+
@Override
protected String afterTestComponentConfigKey() {
return "spring.cloud.openfeign.client.config.my-client.encoder";
diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/encoder/EncoderComponentAssert.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/encoder/EncoderComponentAssert.java
new file mode 100644
index 0000000..b79c0d3
--- /dev/null
+++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/encoder/EncoderComponentAssert.java
@@ -0,0 +1,34 @@
+package io.microsphere.spring.cloud.openfeign.encoder;
+
+import feign.ResponseHandler;
+import feign.codec.Encoder;
+import io.microsphere.spring.cloud.openfeign.FeignComponentAssert;
+import io.microsphere.spring.cloud.openfeign.components.DecoratedEncoder;
+
+import java.lang.reflect.Field;
+
+/**
+ * @author 韩超
+ * @since 0.0.1
+ */
+public class EncoderComponentAssert extends FeignComponentAssert {
+
+ public static final EncoderComponentAssert INSTANCE = new EncoderComponentAssert();
+
+ private EncoderComponentAssert() {
+
+ }
+
+ @Override
+ protected Encoder loadCurrentComponent(Object configuration, ResponseHandler responseHandler) throws Exception {
+ Class> configurationClass = configuration.getClass();
+ Field buildTemplateFromArgs = configurationClass.getDeclaredField("buildTemplateFromArgs");
+ buildTemplateFromArgs.setAccessible(true);
+ Object buildTemplateFromArgsValue = buildTemplateFromArgs.get(configuration);
+ Class> buildTemplateFromArgsType = buildTemplateFromArgsValue.getClass();
+ Field encoderField = buildTemplateFromArgsType.getDeclaredField("encoder");
+ encoderField.setAccessible(true);
+ DecoratedEncoder encoder = (DecoratedEncoder)encoderField.get(buildTemplateFromArgsValue);
+ return encoder.delegate();
+ }
+}
diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/errordecoder/AErrorDecoder.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/errordecoder/AErrorDecoder.java
index 7fb72d9..b9a9d2a 100644
--- a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/errordecoder/AErrorDecoder.java
+++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/errordecoder/AErrorDecoder.java
@@ -15,7 +15,6 @@ public class AErrorDecoder implements ErrorDecoder {
@Override
public Exception decode(String methodKey, Response response) {
- log.trace("Error decoding {}", methodKey);
return new IllegalArgumentException("");
}
}
diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/errordecoder/BErrorEncoder.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/errordecoder/BErrorEncoder.java
new file mode 100644
index 0000000..4c7bac0
--- /dev/null
+++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/errordecoder/BErrorEncoder.java
@@ -0,0 +1,16 @@
+package io.microsphere.spring.cloud.openfeign.errordecoder;
+
+import feign.Response;
+import feign.codec.ErrorDecoder;
+
+/**
+ * @author 韩超
+ * @since 0.0.1
+ */
+public class BErrorEncoder implements ErrorDecoder {
+
+ @Override
+ public Exception decode(String methodKey, Response response) {
+ return null;
+ }
+}
diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/errordecoder/ErrorDecoderChangedTest.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/errordecoder/ErrorDecoderChangedTest.java
index 79a2e1b..c014079 100644
--- a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/errordecoder/ErrorDecoderChangedTest.java
+++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/errordecoder/ErrorDecoderChangedTest.java
@@ -2,6 +2,7 @@
import feign.codec.ErrorDecoder;
import io.microsphere.spring.cloud.openfeign.BaseTest;
+import io.microsphere.spring.cloud.openfeign.FeignComponentAssert;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
@@ -13,6 +14,16 @@
@EnableAutoConfiguration
public class ErrorDecoderChangedTest extends BaseTest {
+ @Override
+ protected Class extends ErrorDecoder> beforeTestComponentClass() {
+ return AErrorDecoder.class;
+ }
+
+ @Override
+ protected FeignComponentAssert loadFeignComponentAssert() {
+ return new ErrorDecoderComponentAssert();
+ }
+
@Override
protected String afterTestComponentConfigKey() {
return "spring.cloud.openfeign.client.config.my-client.error-decoder";
@@ -20,6 +31,6 @@ protected String afterTestComponentConfigKey() {
@Override
protected Class extends ErrorDecoder> afterTestComponent() {
- return AErrorDecoder.class;
+ return BErrorEncoder.class;
}
}
diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/errordecoder/ErrorDecoderComponentAssert.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/errordecoder/ErrorDecoderComponentAssert.java
new file mode 100644
index 0000000..1089259
--- /dev/null
+++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/errordecoder/ErrorDecoderComponentAssert.java
@@ -0,0 +1,24 @@
+package io.microsphere.spring.cloud.openfeign.errordecoder;
+
+import feign.ResponseHandler;
+import feign.codec.ErrorDecoder;
+import io.microsphere.spring.cloud.openfeign.FeignComponentAssert;
+import io.microsphere.spring.cloud.openfeign.components.DecoratedErrorDecoder;
+
+import java.lang.reflect.Field;
+
+/**
+ * @author 韩超
+ * @since 0.0.1
+ */
+public class ErrorDecoderComponentAssert extends FeignComponentAssert {
+
+ @Override
+ protected ErrorDecoder loadCurrentComponent(Object configuration, ResponseHandler responseHandler) throws Exception {
+ Class responseHandlerClass = ResponseHandler.class;
+ Field errorDecoderField = responseHandlerClass.getDeclaredField("errorDecoder");
+ errorDecoderField.setAccessible(true);
+ DecoratedErrorDecoder errorDecoder = (DecoratedErrorDecoder)errorDecoderField.get(responseHandler);
+ return errorDecoder.delegate();
+ }
+}
diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/querymapencoder/AQueryMapEncoder.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/querymapencoder/AQueryMapEncoder.java
index 4cde8f0..79e20f1 100644
--- a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/querymapencoder/AQueryMapEncoder.java
+++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/querymapencoder/AQueryMapEncoder.java
@@ -18,7 +18,6 @@ public class AQueryMapEncoder implements QueryMapEncoder {
@Override
public Map encode(Object object) {
- log.trace("AQueryMapEncoder.encode({})", object);
return new HashMap<>();
}
}
diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/querymapencoder/BQueryMapEncoder.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/querymapencoder/BQueryMapEncoder.java
index 0803269..7d271d4 100644
--- a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/querymapencoder/BQueryMapEncoder.java
+++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/querymapencoder/BQueryMapEncoder.java
@@ -18,7 +18,6 @@ public class BQueryMapEncoder implements QueryMapEncoder {
@Override
public Map encode(Object object) {
- log.trace("AQueryMapEncoder.encode({})", object);
return new HashMap<>();
}
}
diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/querymapencoder/QueryMapEncoderChangedTest.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/querymapencoder/QueryMapEncoderChangedTest.java
index 14f9ba8..1afa7df 100644
--- a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/querymapencoder/QueryMapEncoderChangedTest.java
+++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/querymapencoder/QueryMapEncoderChangedTest.java
@@ -2,6 +2,7 @@
import feign.QueryMapEncoder;
import io.microsphere.spring.cloud.openfeign.BaseTest;
+import io.microsphere.spring.cloud.openfeign.FeignComponentAssert;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
@@ -13,6 +14,16 @@
@EnableAutoConfiguration
public class QueryMapEncoderChangedTest extends BaseTest {
+ @Override
+ protected Class extends QueryMapEncoder> beforeTestComponentClass() {
+ return AQueryMapEncoder.class;
+ }
+
+ @Override
+ protected FeignComponentAssert loadFeignComponentAssert() {
+ return new QueryMapEncoderComponentAssert();
+ }
+
@Override
protected String afterTestComponentConfigKey() {
return "spring.cloud.openfeign.client.config.my-client.query-map-encoder";
diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/querymapencoder/QueryMapEncoderComponentAssert.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/querymapencoder/QueryMapEncoderComponentAssert.java
new file mode 100644
index 0000000..9eeb180
--- /dev/null
+++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/querymapencoder/QueryMapEncoderComponentAssert.java
@@ -0,0 +1,28 @@
+package io.microsphere.spring.cloud.openfeign.querymapencoder;
+
+import feign.QueryMapEncoder;
+import feign.ResponseHandler;
+import io.microsphere.spring.cloud.openfeign.FeignComponentAssert;
+import io.microsphere.spring.cloud.openfeign.components.DecoratedQueryMapEncoder;
+
+import java.lang.reflect.Field;
+
+/**
+ * @author 韩超
+ * @since 0.0.1
+ */
+public class QueryMapEncoderComponentAssert extends FeignComponentAssert {
+
+ @Override
+ protected QueryMapEncoder loadCurrentComponent(Object configuration, ResponseHandler responseHandler) throws Exception {
+ Class> configurationClass = configuration.getClass();
+ Field buildTemplateFromArgs = configurationClass.getDeclaredField("buildTemplateFromArgs");
+ buildTemplateFromArgs.setAccessible(true);
+ Object buildTemplateFromArgsValue = buildTemplateFromArgs.get(configuration);
+ Class> buildTemplateFromArgsType = buildTemplateFromArgsValue.getClass().getSuperclass();
+ Field encoderField = buildTemplateFromArgsType.getDeclaredField("queryMapEncoder");
+ encoderField.setAccessible(true);
+ DecoratedQueryMapEncoder encoder = (DecoratedQueryMapEncoder)encoderField.get(buildTemplateFromArgsValue);
+ return encoder.delegate();
+ }
+}
diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/requestInterceptor/ARequestInterceptor.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/requestInterceptor/ARequestInterceptor.java
index 84ffa4d..d7e8fc0 100644
--- a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/requestInterceptor/ARequestInterceptor.java
+++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/requestInterceptor/ARequestInterceptor.java
@@ -11,6 +11,5 @@ public class ARequestInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
- System.out.println(getClass() + ": A is working...");
}
}
diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/requestInterceptor/BRequestInterceptor.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/requestInterceptor/BRequestInterceptor.java
index 108f58c..b06dd60 100644
--- a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/requestInterceptor/BRequestInterceptor.java
+++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/requestInterceptor/BRequestInterceptor.java
@@ -11,6 +11,5 @@ public class BRequestInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
- System.out.println(getClass() + "B is working...");
}
}
diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/requestInterceptor/RequestInterceptorChangedTest.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/requestInterceptor/RequestInterceptorChangedTest.java
index f9651f1..b290206 100644
--- a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/requestInterceptor/RequestInterceptorChangedTest.java
+++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/requestInterceptor/RequestInterceptorChangedTest.java
@@ -2,6 +2,7 @@
import feign.RequestInterceptor;
import io.microsphere.spring.cloud.openfeign.BaseTest;
+import io.microsphere.spring.cloud.openfeign.FeignComponentAssert;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
@@ -13,6 +14,16 @@
@EnableAutoConfiguration
public class RequestInterceptorChangedTest extends BaseTest {
+ @Override
+ protected Class extends RequestInterceptor> beforeTestComponentClass() {
+ return ARequestInterceptor.class;
+ }
+
+ @Override
+ protected FeignComponentAssert loadFeignComponentAssert() {
+ return new RequestInterceptorComponentAssert();
+ }
+
@Override
protected String afterTestComponentConfigKey() {
return "spring.cloud.openfeign.client.config.my-client.request-interceptors[0]";
diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/requestInterceptor/RequestInterceptorComponentAssert.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/requestInterceptor/RequestInterceptorComponentAssert.java
new file mode 100644
index 0000000..c3eb60a
--- /dev/null
+++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/requestInterceptor/RequestInterceptorComponentAssert.java
@@ -0,0 +1,40 @@
+package io.microsphere.spring.cloud.openfeign.requestInterceptor;
+
+import feign.RequestInterceptor;
+import feign.ResponseHandler;
+import io.microsphere.spring.cloud.openfeign.FeignComponentAssert;
+import io.microsphere.spring.cloud.openfeign.components.CompositedRequestInterceptor;
+
+import java.lang.reflect.Field;
+import java.util.List;
+
+/**
+ * @author 韩超
+ * @since 0.0.1
+ */
+public class RequestInterceptorComponentAssert extends FeignComponentAssert {
+
+ @Override
+ protected CompositedRequestInterceptor loadCurrentComponent(Object configuration, ResponseHandler responseHandler) throws Exception {
+ Class> configurationClass = configuration.getClass();
+ Field retryField = configurationClass.getDeclaredField("requestInterceptors");
+ retryField.setAccessible(true);
+ List retryer = (List) retryField.get(configuration);
+ for (RequestInterceptor interceptor : retryer) {
+ if (interceptor instanceof CompositedRequestInterceptor) {
+ return (CompositedRequestInterceptor) interceptor;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public boolean expect(Object configuration, ResponseHandler responseHandler, Class expectedClass) throws Exception {
+ CompositedRequestInterceptor requestInterceptor = loadCurrentComponent(configuration, responseHandler);
+ for(RequestInterceptor interceptor : requestInterceptor.getRequestInterceptors()) {
+ if (expectedClass.equals(interceptor.getClass()))
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/retryer/BRetry.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/retryer/BRetry.java
new file mode 100644
index 0000000..b8ac51c
--- /dev/null
+++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/retryer/BRetry.java
@@ -0,0 +1,21 @@
+package io.microsphere.spring.cloud.openfeign.retryer;
+
+import feign.RetryableException;
+import feign.Retryer;
+
+/**
+ * @author 韩超
+ * @since 0.0.1
+ */
+public class BRetry implements Retryer {
+
+ @Override
+ public void continueOrPropagate(RetryableException e) {
+
+ }
+
+ @Override
+ public Retryer clone() {
+ return this;
+ }
+}
diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/retryer/RetryerChangedTest.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/retryer/RetryerChangedTest.java
index 5139dfc..1ac2c78 100644
--- a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/retryer/RetryerChangedTest.java
+++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/retryer/RetryerChangedTest.java
@@ -2,6 +2,7 @@
import feign.Retryer;
import io.microsphere.spring.cloud.openfeign.BaseTest;
+import io.microsphere.spring.cloud.openfeign.FeignComponentAssert;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
@@ -13,6 +14,16 @@
@EnableAutoConfiguration
public class RetryerChangedTest extends BaseTest {
+ @Override
+ protected Class extends Retryer> beforeTestComponentClass() {
+ return ARetry.class;
+ }
+
+ @Override
+ protected FeignComponentAssert loadFeignComponentAssert() {
+ return new RetryerComponentAssert();
+ }
+
@Override
protected String afterTestComponentConfigKey() {
return "spring.cloud.openfeign.client.config.my-client.retryer";
@@ -20,6 +31,6 @@ protected String afterTestComponentConfigKey() {
@Override
protected Class extends Retryer> afterTestComponent() {
- return ARetry.class;
+ return BRetry.class;
}
}
diff --git a/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/retryer/RetryerComponentAssert.java b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/retryer/RetryerComponentAssert.java
new file mode 100644
index 0000000..19dc78c
--- /dev/null
+++ b/microsphere-spring-cloud-openfeign/src/test/java/io/microsphere/spring/cloud/openfeign/retryer/RetryerComponentAssert.java
@@ -0,0 +1,24 @@
+package io.microsphere.spring.cloud.openfeign.retryer;
+
+import feign.ResponseHandler;
+import feign.Retryer;
+import io.microsphere.spring.cloud.openfeign.FeignComponentAssert;
+import io.microsphere.spring.cloud.openfeign.components.DecoratedRetryer;
+
+import java.lang.reflect.Field;
+
+/**
+ * @author 韩超
+ * @since 0.0.1
+ */
+public class RetryerComponentAssert extends FeignComponentAssert {
+
+ @Override
+ protected Retryer loadCurrentComponent(Object configuration, ResponseHandler responseHandler) throws Exception {
+ Class> configurationClass = configuration.getClass();
+ Field retryField = configurationClass.getDeclaredField("retryer");
+ retryField.setAccessible(true);
+ DecoratedRetryer retryer = (DecoratedRetryer) retryField.get(configuration);
+ return retryer.delegate();
+ }
+}