+ * 不加 @Configuration:该类仅通过 defaultConfiguration 注册到 Feign 子上下文,
+ * 避免被 pigx-boot 等主上下文组件扫描误引入。
+ *
+ * @author lengleng
+ */
+public class PigxFeignClientConfiguration {
+
+ /**
+ * 构建并预热 Feign 消息转换器。
+ * @param customizers Spring Boot 客户端转换器定制器
+ * @param cloudCustomizers Spring Cloud 转换器定制器
+ * @return 已完成初始化的 FeignHttpMessageConverters
+ */
+ @Bean
+ public FeignHttpMessageConverters pigxFeignHttpMessageConverters(
+ ObjectProvider
+ * 注意:显式指定该属性会整体替换默认值,即丢失
+ * {@link PigxFeignClientConfiguration} 的消息转换器预热能力;如需自定义,
+ * 请把 {@code PigxFeignClientConfiguration.class} 一并加入数组。
*
* @see FeignClientsConfiguration for the defaults
*/
@AliasFor(annotation = EnableFeignClients.class)
- Class>[] defaultConfiguration() default {};
+ Class>[] defaultConfiguration() default { PigxFeignClientConfiguration.class };
/**
* List of classes annotated with @FeignClient. If not empty, disables classpath
diff --git a/pigx-common/pigx-common-feign/src/test/java/com/pig4cloud/pigx/common/feign/PigxFeignClientConfigurationTests.java b/pigx-common/pigx-common-feign/src/test/java/com/pig4cloud/pigx/common/feign/PigxFeignClientConfigurationTests.java
new file mode 100644
index 000000000..e86a7741b
--- /dev/null
+++ b/pigx-common/pigx-common-feign/src/test/java/com/pig4cloud/pigx/common/feign/PigxFeignClientConfigurationTests.java
@@ -0,0 +1,48 @@
+package com.pig4cloud.pigx.common.feign;
+
+import com.pig4cloud.pigx.common.feign.annotation.EnablePigxFeignClients;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.support.StaticListableBeanFactory;
+import org.springframework.boot.http.converter.autoconfigure.ClientHttpMessageConvertersCustomizer;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.cloud.openfeign.support.FeignHttpMessageConverters;
+import org.springframework.cloud.openfeign.support.HttpMessageConverterCustomizer;
+import org.springframework.core.annotation.AnnotatedElementUtils;
+import org.springframework.core.annotation.AnnotationAttributes;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class PigxFeignClientConfigurationTests {
+
+ @EnablePigxFeignClients
+ private static class TestApplication {
+ }
+
+ @Test
+ void shouldInitializeConvertersBeforePublishingBean() {
+ AtomicBoolean initialized = new AtomicBoolean();
+ StaticListableBeanFactory clientCustomizerFactory = new StaticListableBeanFactory();
+ clientCustomizerFactory.addBean("initializationProbe",
+ (ClientHttpMessageConvertersCustomizer) builder -> initialized.set(true));
+ StaticListableBeanFactory cloudCustomizerFactory = new StaticListableBeanFactory();
+
+ FeignHttpMessageConverters converters = new PigxFeignClientConfiguration().pigxFeignHttpMessageConverters(
+ clientCustomizerFactory.getBeanProvider(ClientHttpMessageConvertersCustomizer.class),
+ cloudCustomizerFactory.getBeanProvider(HttpMessageConverterCustomizer.class));
+
+ assertThat(initialized).isTrue();
+ assertThat(converters.getConverters()).isNotEmpty();
+ }
+
+ @Test
+ void shouldRegisterWarmupConfigurationForAllFeignClients() {
+ AnnotationAttributes attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(TestApplication.class,
+ EnableFeignClients.class);
+
+ assertThat(attributes).isNotNull();
+ assertThat(attributes.getClassArray("defaultConfiguration")).contains(PigxFeignClientConfiguration.class);
+ }
+
+}
@Configuration for all feign clients. Can contain override
* @Bean definition for the pieces that make up the client, for instance
* {@link feign.codec.Decoder}, {@link feign.codec.Encoder}, {@link feign.Contract}.
+ *