From 3c4e1e1206c8dac8e9f9c2b9b260934507d71fb8 Mon Sep 17 00:00:00 2001 From: ikjeong Date: Mon, 31 Aug 2026 01:37:03 +0900 Subject: [PATCH] Fix Jackson classpath guard Use JacksonModule instead of java.lang.Module so Feign Jackson auto-configuration is skipped when Jackson databind is absent. Fixes gh-1407 Signed-off-by: ikjeong --- .../openfeign/FeignAutoConfiguration.java | 3 ++- .../openfeign/FeignAutoConfigurationTests.java | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignAutoConfiguration.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignAutoConfiguration.java index 56f28cde9..aee445c60 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignAutoConfiguration.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignAutoConfiguration.java @@ -31,6 +31,7 @@ import feign.http2client.Http2Client; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import tools.jackson.databind.JacksonModule; import org.springframework.aot.hint.MemberCategory; import org.springframework.aot.hint.RuntimeHints; @@ -126,7 +127,7 @@ public Capability cachingCapability(CacheInterceptor cacheInterceptor) { } @Configuration(proxyBeanMethods = false) - @ConditionalOnClass({ Module.class, Page.class, Sort.class }) + @ConditionalOnClass({ JacksonModule.class, Page.class, Sort.class }) @ConditionalOnProperty(value = "spring.cloud.openfeign.autoconfiguration.jackson.enabled", havingValue = "true", matchIfMissing = true) protected static class FeignJacksonConfiguration { diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignAutoConfigurationTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignAutoConfigurationTests.java index 6ae23257d..abf91a87a 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignAutoConfigurationTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignAutoConfigurationTests.java @@ -29,6 +29,7 @@ import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.assertj.AssertableApplicationContext; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.cloud.client.circuitbreaker.CircuitBreaker; @@ -63,6 +64,23 @@ class FeignAutoConfigurationTests { .withConfiguration(AutoConfigurations.of(FeignAutoConfiguration.class)) .withPropertyValues("spring.cloud.openfeign.httpclient.hc5.enabled=false"); + @Test + void shouldConfigureJacksonModules() { + runner.run(context -> assertThat(context).hasBean("pageJacksonModule").hasBean("sortModule")); + } + + @Test + void shouldNotConfigureJacksonModulesWhenJacksonDatabindIsMissing() { + runner.withClassLoader(new FilteredClassLoader("tools.jackson.databind")) + .run(context -> assertThat(context).doesNotHaveBean("pageJacksonModule").doesNotHaveBean("sortModule")); + } + + @Test + void shouldNotConfigureJacksonModulesWhenSpringDataIsMissing() { + runner.withClassLoader(new FilteredClassLoader("org.springframework.data")) + .run(context -> assertThat(context).doesNotHaveBean("pageJacksonModule").doesNotHaveBean("sortModule")); + } + @Test void shouldInstantiateDefaultTargeterWhenFeignCircuitBreakerIsDisabled() { runner.withPropertyValues("spring.cloud.openfeign.circuitbreaker.enabled=false")