Skip to content

Commit 1ed5466

Browse files
authored
Adapt to restructuring changes in Spring Boot 4.0 (#1213)
This commit updates imports and dependencies to adapt to Spring Boot 4.0's restructuring. This commit also stops using some APIs that have been deprecated since Spring Boot 3.4. Signed-off-by: Andy Wilkinson <[email protected]>
1 parent 0b062e7 commit 1ed5466

30 files changed

+140
-112
lines changed

spring-cloud-openfeign-core/pom.xml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,21 @@
2424
<groupId>org.springframework.boot</groupId>
2525
<artifactId>spring-boot-autoconfigure</artifactId>
2626
</dependency>
27+
<dependency>
28+
<groupId>org.springframework.boot</groupId>
29+
<artifactId>spring-boot-data-commons</artifactId>
30+
<optional>true</optional>
31+
</dependency>
32+
<dependency>
33+
<groupId>org.springframework.boot</groupId>
34+
<artifactId>spring-boot-data-rest</artifactId>
35+
<optional>true</optional>
36+
</dependency>
37+
<dependency>
38+
<groupId>org.springframework.boot</groupId>
39+
<artifactId>spring-boot-jackson</artifactId>
40+
<optional>true</optional>
41+
</dependency>
2742
<dependency>
2843
<groupId>org.springframework.boot</groupId>
2944
<artifactId>spring-boot-starter-actuator</artifactId>
@@ -164,6 +179,11 @@
164179
<artifactId>reactor-test</artifactId>
165180
<scope>test</scope>
166181
</dependency>
182+
<dependency>
183+
<groupId>org.springframework.boot</groupId>
184+
<artifactId>spring-boot-cache</artifactId>
185+
<scope>test</scope>
186+
</dependency>
167187
<dependency>
168188
<groupId>org.springframework.boot</groupId>
169189
<artifactId>spring-boot-starter-data-rest</artifactId>

spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientsConfiguration.java

Lines changed: 50 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2013-2024 the original author or authors.
2+
* Copyright 2013-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -42,8 +42,8 @@
4242
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
4343
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
4444
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
45-
import org.springframework.boot.autoconfigure.data.web.SpringDataWebProperties;
46-
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
45+
import org.springframework.boot.data.autoconfigure.web.SpringDataWebProperties;
46+
import org.springframework.boot.http.converter.autoconfigure.HttpMessageConverters;
4747
import org.springframework.cloud.client.circuitbreaker.CircuitBreaker;
4848
import org.springframework.cloud.client.circuitbreaker.CircuitBreakerFactory;
4949
import org.springframework.cloud.openfeign.clientconfig.FeignClientConfigurer;
@@ -61,6 +61,7 @@
6161
import org.springframework.context.annotation.Configuration;
6262
import org.springframework.context.annotation.Scope;
6363
import org.springframework.core.convert.ConversionService;
64+
import org.springframework.data.domain.Pageable;
6465
import org.springframework.format.support.DefaultFormattingConversionService;
6566
import org.springframework.format.support.FormattingConversionService;
6667

@@ -90,9 +91,6 @@ public class FeignClientsConfiguration {
9091
@Autowired(required = false)
9192
private Logger logger;
9293

93-
@Autowired(required = false)
94-
private SpringDataWebProperties springDataWebProperties;
95-
9694
@Autowired(required = false)
9795
private FeignClientProperties feignClientProperties;
9896

@@ -110,36 +108,7 @@ public Decoder feignDecoder(ObjectProvider<HttpMessageConverterCustomizer> custo
110108
@ConditionalOnMissingClass("org.springframework.data.domain.Pageable")
111109
public Encoder feignEncoder(ObjectProvider<AbstractFormWriter> formWriterProvider,
112110
ObjectProvider<HttpMessageConverterCustomizer> customizers) {
113-
return springEncoder(formWriterProvider, encoderProperties, customizers);
114-
}
115-
116-
@Bean
117-
@ConditionalOnClass(name = "org.springframework.data.domain.Pageable")
118-
@ConditionalOnMissingBean
119-
public Encoder feignEncoderPageable(ObjectProvider<AbstractFormWriter> formWriterProvider,
120-
ObjectProvider<HttpMessageConverterCustomizer> customizers) {
121-
PageableSpringEncoder encoder = new PageableSpringEncoder(
122-
springEncoder(formWriterProvider, encoderProperties, customizers));
123-
124-
if (springDataWebProperties != null) {
125-
encoder.setPageParameter(springDataWebProperties.getPageable().getPageParameter());
126-
encoder.setSizeParameter(springDataWebProperties.getPageable().getSizeParameter());
127-
encoder.setSortParameter(springDataWebProperties.getSort().getSortParameter());
128-
}
129-
return encoder;
130-
}
131-
132-
@Bean
133-
@ConditionalOnClass(name = "org.springframework.data.domain.Pageable")
134-
@ConditionalOnMissingBean
135-
public QueryMapEncoder feignQueryMapEncoderPageable() {
136-
PageableSpringQueryMapEncoder queryMapEncoder = new PageableSpringQueryMapEncoder();
137-
if (springDataWebProperties != null) {
138-
queryMapEncoder.setPageParameter(springDataWebProperties.getPageable().getPageParameter());
139-
queryMapEncoder.setSizeParameter(springDataWebProperties.getPageable().getSizeParameter());
140-
queryMapEncoder.setSortParameter(springDataWebProperties.getSort().getSortParameter());
141-
}
142-
return queryMapEncoder;
111+
return springEncoder(formWriterProvider, messageConverters, encoderProperties, customizers);
143112
}
144113

145114
@Bean
@@ -176,8 +145,9 @@ public FeignClientConfigurer feignClientConfigurer() {
176145
};
177146
}
178147

179-
private Encoder springEncoder(ObjectProvider<AbstractFormWriter> formWriterProvider,
180-
FeignEncoderProperties encoderProperties, ObjectProvider<HttpMessageConverterCustomizer> customizers) {
148+
private static Encoder springEncoder(ObjectProvider<AbstractFormWriter> formWriterProvider,
149+
ObjectFactory<HttpMessageConverters> messageConverters, FeignEncoderProperties encoderProperties,
150+
ObjectProvider<HttpMessageConverterCustomizer> customizers) {
181151
AbstractFormWriter formWriter = formWriterProvider.getIfAvailable();
182152

183153
if (formWriter != null) {
@@ -189,7 +159,7 @@ private Encoder springEncoder(ObjectProvider<AbstractFormWriter> formWriterProvi
189159
}
190160
}
191161

192-
private class SpringPojoFormEncoder extends SpringFormEncoder {
162+
private static class SpringPojoFormEncoder extends SpringFormEncoder {
193163

194164
SpringPojoFormEncoder(AbstractFormWriter formWriter) {
195165
super();
@@ -200,6 +170,47 @@ private class SpringPojoFormEncoder extends SpringFormEncoder {
200170

201171
}
202172

173+
@Configuration(proxyBeanMethods = false)
174+
@ConditionalOnClass({ Pageable.class, SpringDataWebProperties.class })
175+
static class SpringDataConfiguration {
176+
177+
private final SpringDataWebProperties springDataWebProperties;
178+
179+
SpringDataConfiguration(ObjectProvider<SpringDataWebProperties> springDataWebProperties) {
180+
this.springDataWebProperties = springDataWebProperties.getIfAvailable();
181+
}
182+
183+
@Bean
184+
@ConditionalOnMissingBean
185+
public Encoder feignEncoderPageable(ObjectProvider<AbstractFormWriter> formWriterProvider,
186+
ObjectFactory<HttpMessageConverters> messageConverters,
187+
ObjectProvider<FeignEncoderProperties> encoderProperties,
188+
ObjectProvider<HttpMessageConverterCustomizer> customizers) {
189+
PageableSpringEncoder encoder = new PageableSpringEncoder(springEncoder(formWriterProvider,
190+
messageConverters, encoderProperties.getIfAvailable(), customizers));
191+
192+
if (springDataWebProperties != null) {
193+
encoder.setPageParameter(springDataWebProperties.getPageable().getPageParameter());
194+
encoder.setSizeParameter(springDataWebProperties.getPageable().getSizeParameter());
195+
encoder.setSortParameter(springDataWebProperties.getSort().getSortParameter());
196+
}
197+
return encoder;
198+
}
199+
200+
@Bean
201+
@ConditionalOnMissingBean
202+
public QueryMapEncoder feignQueryMapEncoderPageable() {
203+
PageableSpringQueryMapEncoder queryMapEncoder = new PageableSpringQueryMapEncoder();
204+
if (springDataWebProperties != null) {
205+
queryMapEncoder.setPageParameter(springDataWebProperties.getPageable().getPageParameter());
206+
queryMapEncoder.setSizeParameter(springDataWebProperties.getPageable().getSizeParameter());
207+
queryMapEncoder.setSortParameter(springDataWebProperties.getSort().getSortParameter());
208+
}
209+
return queryMapEncoder;
210+
}
211+
212+
}
213+
203214
@Configuration(proxyBeanMethods = false)
204215
@Conditional(FeignCircuitBreakerDisabledConditions.class)
205216
protected static class DefaultFeignBuilderConfiguration {

spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/hateoas/FeignHalAutoConfiguration.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2016-2022 the original author or authors.
2+
* Copyright 2016-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -20,13 +20,9 @@
2020
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
2121
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2222
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
23-
import org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration;
24-
import org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration;
25-
import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration;
2623
import org.springframework.cloud.openfeign.support.HttpMessageConverterCustomizer;
2724
import org.springframework.context.annotation.Bean;
2825
import org.springframework.context.annotation.Configuration;
29-
import org.springframework.hateoas.config.HateoasConfiguration;
3026
import org.springframework.hateoas.config.WebConverters;
3127

3228
/**
@@ -36,8 +32,9 @@
3632
@Configuration(proxyBeanMethods = false)
3733
@ConditionalOnWebApplication
3834
@ConditionalOnClass(WebConverters.class)
39-
@AutoConfigureAfter({ JacksonAutoConfiguration.class, HttpMessageConvertersAutoConfiguration.class,
40-
RepositoryRestMvcAutoConfiguration.class, HateoasConfiguration.class })
35+
@AutoConfigureAfter(name = { "org.springframework.boot.data.rest.autoconfigure.RepositoryRestMvcAutoConfiguration",
36+
"org.springframework.boot.http.converter.autoconfigure.HttpMessageConvertersAutoConfiguration",
37+
"org.springframework.boot.jackson.autoconfigure.JacksonAutoConfiguration" })
4138
public class FeignHalAutoConfiguration {
4239

4340
@Bean

spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/support/SpringDecoder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2013-2024 the original author or authors.
2+
* Copyright 2013-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -30,7 +30,7 @@
3030

3131
import org.springframework.beans.factory.ObjectFactory;
3232
import org.springframework.beans.factory.ObjectProvider;
33-
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
33+
import org.springframework.boot.http.converter.autoconfigure.HttpMessageConverters;
3434
import org.springframework.http.HttpHeaders;
3535
import org.springframework.http.HttpStatusCode;
3636
import org.springframework.http.client.ClientHttpResponse;

spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/support/SpringEncoder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2013-2023 the original author or authors.
2+
* Copyright 2013-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -38,7 +38,7 @@
3838

3939
import org.springframework.beans.factory.ObjectFactory;
4040
import org.springframework.beans.factory.ObjectProvider;
41-
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
41+
import org.springframework.boot.http.converter.autoconfigure.HttpMessageConverters;
4242
import org.springframework.cloud.openfeign.encoding.HttpEncoding;
4343
import org.springframework.http.HttpHeaders;
4444
import org.springframework.http.HttpOutputMessage;

spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignClientFactoryBeanIntegrationTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2013-2024 the original author or authors.
2+
* Copyright 2013-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -25,7 +25,7 @@
2525
import org.springframework.beans.factory.annotation.Autowired;
2626
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
2727
import org.springframework.boot.test.context.SpringBootTest;
28-
import org.springframework.boot.test.web.server.LocalServerPort;
28+
import org.springframework.boot.web.server.test.LocalServerPort;
2929
import org.springframework.cloud.client.DefaultServiceInstance;
3030
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient;
3131
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients;

spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/FeignClientsMicrometerAutoConfigurationTests.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2022-2022 the original author or authors.
2+
* Copyright 2022-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -20,10 +20,10 @@
2020
import feign.micrometer.MicrometerObservationCapability;
2121
import org.junit.jupiter.api.Test;
2222

23-
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
24-
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
25-
import org.springframework.boot.actuate.autoconfigure.observation.ObservationAutoConfiguration;
2623
import org.springframework.boot.autoconfigure.AutoConfigurations;
24+
import org.springframework.boot.metrics.autoconfigure.MetricsAutoConfiguration;
25+
import org.springframework.boot.metrics.autoconfigure.export.simple.SimpleMetricsExportAutoConfiguration;
26+
import org.springframework.boot.observation.autoconfigure.ObservationAutoConfiguration;
2727
import org.springframework.boot.test.context.FilteredClassLoader;
2828
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
2929

spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/SpringDecoderIntegrationTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2013-2024 the original author or authors.
2+
* Copyright 2013-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -28,7 +28,7 @@
2828
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
2929
import org.springframework.boot.test.context.SpringBootTest;
3030
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
31-
import org.springframework.boot.test.web.server.LocalServerPort;
31+
import org.springframework.boot.web.server.test.LocalServerPort;
3232
import org.springframework.cloud.openfeign.support.SpringDecoder;
3333
import org.springframework.cloud.openfeign.test.NoSecurityConfiguration;
3434
import org.springframework.context.annotation.Configuration;

spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/SpringDecoderTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2013-2024 the original author or authors.
2+
* Copyright 2013-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -22,7 +22,7 @@
2222
import org.junit.jupiter.api.Test;
2323

2424
import org.springframework.beans.factory.ObjectFactory;
25-
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
25+
import org.springframework.boot.http.converter.autoconfigure.HttpMessageConverters;
2626
import org.springframework.cloud.openfeign.support.SpringDecoder;
2727

2828
import static org.assertj.core.api.Assertions.assertThatCode;

spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/aot/FeignAotTests.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2022-2022 the original author or authors.
2+
* Copyright 2022-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -30,14 +30,14 @@
3030
import org.springframework.aot.test.generate.TestGenerationContext;
3131
import org.springframework.beans.factory.annotation.Autowired;
3232
import org.springframework.boot.autoconfigure.AutoConfigurations;
33-
import org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration;
3433
import org.springframework.boot.context.annotation.UserConfigurations;
3534
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
3635
import org.springframework.boot.test.system.CapturedOutput;
3736
import org.springframework.boot.test.system.OutputCaptureExtension;
3837
import org.springframework.boot.test.util.TestPropertyValues;
39-
import org.springframework.boot.web.servlet.context.AnnotationConfigServletWebApplicationContext;
40-
import org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext;
38+
import org.springframework.boot.tomcat.autoconfigure.servlet.TomcatServletWebServerAutoConfiguration;
39+
import org.springframework.boot.web.context.servlet.AnnotationConfigServletWebApplicationContext;
40+
import org.springframework.boot.web.server.servlet.context.ServletWebServerApplicationContext;
4141
import org.springframework.cloud.openfeign.EnableFeignClients;
4242
import org.springframework.cloud.openfeign.FeignAutoConfiguration;
4343
import org.springframework.cloud.openfeign.FeignClient;
@@ -78,7 +78,7 @@ void shouldStartFeignChildContextsFromAotContributions(CapturedOutput output) {
7878
WebApplicationContextRunner contextRunner = new WebApplicationContextRunner(
7979
AnnotationConfigServletWebApplicationContext::new)
8080
.withConfiguration(
81-
AutoConfigurations.of(ServletWebServerFactoryAutoConfiguration.class, FeignAutoConfiguration.class))
81+
AutoConfigurations.of(TomcatServletWebServerAutoConfiguration.class, FeignAutoConfiguration.class))
8282
.withConfiguration(UserConfigurations.of(TestFeignConfiguration.class))
8383
.withPropertyValues("logging.level.org.springframework.cloud=DEBUG");
8484
contextRunner.prepare(context -> {

0 commit comments

Comments
 (0)