Skip to content

Commit c69d3ef

Browse files
committed
Rename 'spring.http.client' properties to 'spring.http.client.settings'
Deprecate 'spring.http.client' properties in favor of 'spring.http.client.settings` to align with the new reactive client properties. Closes gh-44958
1 parent 068f621 commit c69d3ef

File tree

12 files changed

+299
-81
lines changed

12 files changed

+299
-81
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/http/client/AbstractHttpClientProperties.java

+1-19
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,8 @@
1818

1919
import java.time.Duration;
2020

21-
import org.springframework.beans.factory.ObjectProvider;
2221
import org.springframework.boot.http.client.HttpClientSettings;
2322
import org.springframework.boot.http.client.HttpRedirects;
24-
import org.springframework.boot.ssl.SslBundle;
25-
import org.springframework.boot.ssl.SslBundles;
26-
import org.springframework.util.StringUtils;
2723

2824
/**
2925
* Abstract base class for properties that directly or indirectly make use of a blocking
@@ -38,7 +34,7 @@ public abstract class AbstractHttpClientProperties {
3834
/**
3935
* Handling for HTTP redirects.
4036
*/
41-
private HttpRedirects redirects = HttpRedirects.FOLLOW_WHEN_POSSIBLE;
37+
private HttpRedirects redirects;
4238

4339
/**
4440
* Default connect timeout for a client HTTP request.
@@ -83,20 +79,6 @@ public Ssl getSsl() {
8379
return this.ssl;
8480
}
8581

86-
/**
87-
* Return {@link HttpClientSettings} based on these properties.
88-
* @param sslBundles a {@link SslBundles} provider
89-
* @return the {@link HttpClientSettings}
90-
*/
91-
protected HttpClientSettings httpClientSettings(ObjectProvider<SslBundles> sslBundles) {
92-
return new HttpClientSettings(this.redirects, this.connectTimeout, this.readTimeout, sslBundle(sslBundles));
93-
}
94-
95-
private SslBundle sslBundle(ObjectProvider<SslBundles> sslBundles) {
96-
String name = getSsl().getBundle();
97-
return (StringUtils.hasLength(name)) ? sslBundles.getObject().getBundle(name) : null;
98-
}
99-
10082
/**
10183
* SSL configuration.
10284
*/

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/http/client/AbstractHttpRequestFactoryProperties.java

-10
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,6 @@ public void setFactory(Factory factory) {
4646
this.factory = factory;
4747
}
4848

49-
/**
50-
* Return a {@link ClientHttpRequestFactoryBuilder} based on the properties.
51-
* @param classLoader the class loader to use for detection
52-
* @return a {@link ClientHttpRequestFactoryBuilder}
53-
*/
54-
protected final ClientHttpRequestFactoryBuilder<?> factoryBuilder(ClassLoader classLoader) {
55-
Factory factory = getFactory();
56-
return (factory != null) ? factory.builder() : ClientHttpRequestFactoryBuilder.detect(classLoader);
57-
}
58-
5949
/**
6050
* Supported factory types.
6151
*/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
/*
2+
* Copyright 2012-2025 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.autoconfigure.http.client;
18+
19+
import java.time.Duration;
20+
import java.util.Objects;
21+
import java.util.function.Function;
22+
import java.util.function.Predicate;
23+
24+
import org.springframework.beans.factory.ObjectProvider;
25+
import org.springframework.boot.autoconfigure.http.client.AbstractHttpClientProperties.Ssl;
26+
import org.springframework.boot.autoconfigure.http.client.AbstractHttpRequestFactoryProperties.Factory;
27+
import org.springframework.boot.http.client.ClientHttpRequestFactoryBuilder;
28+
import org.springframework.boot.http.client.ClientHttpRequestFactorySettings;
29+
import org.springframework.boot.http.client.ClientHttpRequestFactorySettings.Redirects;
30+
import org.springframework.boot.http.client.HttpRedirects;
31+
import org.springframework.boot.ssl.SslBundle;
32+
import org.springframework.boot.ssl.SslBundles;
33+
import org.springframework.util.StringUtils;
34+
35+
/**
36+
* Helper class to create {@link ClientHttpRequestFactoryBuilder} and
37+
* {@link ClientHttpRequestFactorySettings}.
38+
*
39+
* @author Phillip Webb
40+
*/
41+
class ClientHttpRequestFactories {
42+
43+
private final ObjectProvider<SslBundles> sslBundles;
44+
45+
private final AbstractHttpRequestFactoryProperties[] orderedProperties;
46+
47+
ClientHttpRequestFactories(ObjectProvider<SslBundles> sslBundles,
48+
AbstractHttpRequestFactoryProperties... orderedProperties) {
49+
this.sslBundles = sslBundles;
50+
this.orderedProperties = orderedProperties;
51+
}
52+
53+
ClientHttpRequestFactoryBuilder<?> builder(ClassLoader classLoader) {
54+
Factory factory = getProperty(AbstractHttpRequestFactoryProperties::getFactory);
55+
return (factory != null) ? factory.builder() : ClientHttpRequestFactoryBuilder.detect(classLoader);
56+
}
57+
58+
ClientHttpRequestFactorySettings settings() {
59+
HttpRedirects redirects = getProperty(AbstractHttpRequestFactoryProperties::getRedirects);
60+
Duration connectTimeout = getProperty(AbstractHttpRequestFactoryProperties::getConnectTimeout);
61+
Duration readTimeout = getProperty(AbstractHttpRequestFactoryProperties::getReadTimeout);
62+
String sslBundleName = getProperty(AbstractHttpRequestFactoryProperties::getSsl, Ssl::getBundle,
63+
StringUtils::hasLength);
64+
SslBundle sslBundle = (StringUtils.hasLength(sslBundleName))
65+
? this.sslBundles.getObject().getBundle(sslBundleName) : null;
66+
return new ClientHttpRequestFactorySettings(Redirects.of(redirects), connectTimeout, readTimeout, sslBundle);
67+
}
68+
69+
private <T> T getProperty(Function<AbstractHttpRequestFactoryProperties, T> accessor) {
70+
return getProperty(accessor, Function.identity(), Objects::nonNull);
71+
}
72+
73+
private <P, T> T getProperty(Function<AbstractHttpRequestFactoryProperties, P> accessor, Function<P, T> extractor,
74+
Predicate<T> predicate) {
75+
for (AbstractHttpRequestFactoryProperties properties : this.orderedProperties) {
76+
P value = accessor.apply(properties);
77+
T extracted = (value != null) ? extractor.apply(value) : null;
78+
if (predicate.test(extracted)) {
79+
return extracted;
80+
}
81+
}
82+
return null;
83+
}
84+
85+
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/http/client/HttpClientAutoConfiguration.java

+13-19
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,6 @@
2828
import org.springframework.boot.context.properties.EnableConfigurationProperties;
2929
import org.springframework.boot.http.client.ClientHttpRequestFactoryBuilder;
3030
import org.springframework.boot.http.client.ClientHttpRequestFactorySettings;
31-
import org.springframework.boot.http.client.ClientHttpRequestFactorySettings.Redirects;
32-
import org.springframework.boot.http.client.HttpClientSettings;
33-
import org.springframework.boot.http.client.HttpRedirects;
3431
import org.springframework.boot.ssl.SslBundles;
3532
import org.springframework.boot.util.LambdaSafe;
3633
import org.springframework.context.annotation.Bean;
@@ -44,24 +41,32 @@
4441
* @author Phillip Webb
4542
* @since 3.4.0
4643
*/
44+
@SuppressWarnings("removal")
4745
@AutoConfiguration(after = SslAutoConfiguration.class)
4846
@ConditionalOnClass(ClientHttpRequestFactory.class)
4947
@Conditional(NotReactiveWebApplicationCondition.class)
50-
@EnableConfigurationProperties(HttpClientProperties.class)
48+
@EnableConfigurationProperties({ HttpClientSettingsProperties.class, HttpClientProperties.class })
5149
public class HttpClientAutoConfiguration implements BeanClassLoaderAware {
5250

51+
private final ClientHttpRequestFactories factories;
52+
5353
private ClassLoader beanClassLoader;
5454

55+
HttpClientAutoConfiguration(ObjectProvider<SslBundles> sslBundles, HttpClientSettingsProperties properties,
56+
HttpClientProperties deprecatedProperties) {
57+
this.factories = new ClientHttpRequestFactories(sslBundles, properties, deprecatedProperties);
58+
}
59+
5560
@Override
5661
public void setBeanClassLoader(ClassLoader classLoader) {
5762
this.beanClassLoader = classLoader;
5863
}
5964

6065
@Bean
6166
@ConditionalOnMissingBean
62-
ClientHttpRequestFactoryBuilder<?> clientHttpRequestFactoryBuilder(HttpClientProperties httpClientProperties,
67+
ClientHttpRequestFactoryBuilder<?> clientHttpRequestFactoryBuilder(
6368
ObjectProvider<ClientHttpRequestFactoryBuilderCustomizer<?>> clientHttpRequestFactoryBuilderCustomizers) {
64-
ClientHttpRequestFactoryBuilder<?> builder = httpClientProperties.factoryBuilder(this.beanClassLoader);
69+
ClientHttpRequestFactoryBuilder<?> builder = this.factories.builder(this.beanClassLoader);
6570
return customize(builder, clientHttpRequestFactoryBuilderCustomizers.orderedStream().toList());
6671
}
6772

@@ -76,19 +81,8 @@ private ClientHttpRequestFactoryBuilder<?> customize(ClientHttpRequestFactoryBui
7681

7782
@Bean
7883
@ConditionalOnMissingBean
79-
ClientHttpRequestFactorySettings clientHttpRequestFactorySettings(HttpClientProperties httpClientProperties,
80-
ObjectProvider<SslBundles> sslBundles) {
81-
HttpClientSettings settings = httpClientProperties.httpClientSettings(sslBundles);
82-
return new ClientHttpRequestFactorySettings(asRequestFactoryRedirects(settings.redirects()),
83-
settings.connectTimeout(), settings.readTimeout(), settings.sslBundle());
84-
}
85-
86-
private Redirects asRequestFactoryRedirects(HttpRedirects redirects) {
87-
return switch (redirects) {
88-
case FOLLOW_WHEN_POSSIBLE -> Redirects.FOLLOW_WHEN_POSSIBLE;
89-
case FOLLOW -> Redirects.FOLLOW;
90-
case DONT_FOLLOW -> Redirects.DONT_FOLLOW;
91-
};
84+
ClientHttpRequestFactorySettings clientHttpRequestFactorySettings() {
85+
return this.factories.settings();
9286
}
9387

9488
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/http/client/HttpClientProperties.java

+37
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,12 @@
1616

1717
package org.springframework.boot.autoconfigure.http.client;
1818

19+
import java.time.Duration;
20+
1921
import org.springframework.boot.context.properties.ConfigurationProperties;
22+
import org.springframework.boot.context.properties.DeprecatedConfigurationProperty;
2023
import org.springframework.boot.http.client.ClientHttpRequestFactorySettings;
24+
import org.springframework.boot.http.client.HttpRedirects;
2125

2226
/**
2327
* {@link ConfigurationProperties @ConfigurationProperties} for a Spring's blocking HTTP
@@ -26,8 +30,41 @@
2630
* @author Phillip Webb
2731
* @since 3.4.0
2832
* @see ClientHttpRequestFactorySettings
33+
* @deprecated since 3.5.0 for removal in 4.0.0 in favor of
34+
* {@link HttpClientSettingsProperties}
2935
*/
3036
@ConfigurationProperties("spring.http.client")
37+
@Deprecated(since = "3.5.0", forRemoval = true)
3138
public class HttpClientProperties extends AbstractHttpRequestFactoryProperties {
3239

40+
@Override
41+
@DeprecatedConfigurationProperty(since = "3.5.0", replacement = "spring.http.client.settings.factory")
42+
public Factory getFactory() {
43+
return super.getFactory();
44+
}
45+
46+
@Override
47+
@DeprecatedConfigurationProperty(since = "3.5.0", replacement = "spring.http.client.settings.redirects")
48+
public HttpRedirects getRedirects() {
49+
return super.getRedirects();
50+
}
51+
52+
@Override
53+
@DeprecatedConfigurationProperty(since = "3.5.0", replacement = "spring.http.client.settings.connect-timeout")
54+
public Duration getConnectTimeout() {
55+
return super.getConnectTimeout();
56+
}
57+
58+
@Override
59+
@DeprecatedConfigurationProperty(since = "3.5.0", replacement = "spring.http.client.settings.read-timeout")
60+
public Duration getReadTimeout() {
61+
return super.getReadTimeout();
62+
}
63+
64+
@Override
65+
@DeprecatedConfigurationProperty(since = "3.5.0", replacement = "spring.http.client.settings.ssl")
66+
public Ssl getSsl() {
67+
return super.getSsl();
68+
}
69+
3370
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*
2+
* Copyright 2012-2025 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.autoconfigure.http.client;
18+
19+
import org.springframework.boot.context.properties.ConfigurationProperties;
20+
import org.springframework.boot.http.client.reactive.ClientHttpConnectorSettings;
21+
22+
/**
23+
* {@link ConfigurationProperties @ConfigurationProperties} to configure settings that
24+
* apply to Spring's reactive client HTTP connectors.
25+
*
26+
* @author Phillip Webb
27+
* @since 3.5.0
28+
* @see ClientHttpConnectorSettings
29+
*/
30+
@ConfigurationProperties("spring.http.client.settings")
31+
public class HttpClientSettingsProperties extends AbstractHttpRequestFactoryProperties {
32+
33+
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/http/client/reactive/AbstractClientHttpConnectorProperties.java

-18
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,10 @@
1818

1919
import java.util.function.Supplier;
2020

21-
import org.springframework.beans.factory.ObjectProvider;
2221
import org.springframework.boot.autoconfigure.http.client.AbstractHttpClientProperties;
2322
import org.springframework.boot.context.properties.ConfigurationProperties;
24-
import org.springframework.boot.http.client.HttpClientSettings;
2523
import org.springframework.boot.http.client.reactive.ClientHttpConnectorBuilder;
2624
import org.springframework.boot.http.client.reactive.ClientHttpConnectorSettings;
27-
import org.springframework.boot.ssl.SslBundles;
2825
import org.springframework.http.client.reactive.ClientHttpConnector;
2926

3027
/**
@@ -50,21 +47,6 @@ public void setConnector(Connector connector) {
5047
this.connector = connector;
5148
}
5249

53-
@Override
54-
protected HttpClientSettings httpClientSettings(ObjectProvider<SslBundles> sslBundles) {
55-
return super.httpClientSettings(sslBundles);
56-
}
57-
58-
/**
59-
* Return a {@link ClientHttpConnectorBuilder} based on the properties.
60-
* @param classLoader the class loader to use for detection
61-
* @return a {@link ClientHttpConnectorBuilder}
62-
*/
63-
protected final ClientHttpConnectorBuilder<?> connectorBuilder(ClassLoader classLoader) {
64-
Connector connector = getConnector();
65-
return (connector != null) ? connector.builder() : ClientHttpConnectorBuilder.detect(classLoader);
66-
}
67-
6850
/**
6951
* Supported factory types.
7052
*/

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/http/client/reactive/ClientHttpConnectorAutoConfiguration.java

+10-10
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import org.springframework.boot.autoconfigure.reactor.netty.ReactorNettyConfigurations;
3030
import org.springframework.boot.autoconfigure.ssl.SslAutoConfiguration;
3131
import org.springframework.boot.context.properties.EnableConfigurationProperties;
32-
import org.springframework.boot.http.client.HttpClientSettings;
3332
import org.springframework.boot.http.client.reactive.ClientHttpConnectorBuilder;
3433
import org.springframework.boot.http.client.reactive.ClientHttpConnectorSettings;
3534
import org.springframework.boot.ssl.SslBundles;
@@ -52,8 +51,15 @@
5251
@EnableConfigurationProperties(HttpReactiveClientSettingsProperties.class)
5352
public class ClientHttpConnectorAutoConfiguration implements BeanClassLoaderAware {
5453

54+
private final ClientHttpConnectors connectors;
55+
5556
private ClassLoader beanClassLoader;
5657

58+
ClientHttpConnectorAutoConfiguration(ObjectProvider<SslBundles> sslBundles,
59+
HttpReactiveClientSettingsProperties properties) {
60+
this.connectors = new ClientHttpConnectors(sslBundles, properties);
61+
}
62+
5763
@Override
5864
public void setBeanClassLoader(ClassLoader classLoader) {
5965
this.beanClassLoader = classLoader;
@@ -62,10 +68,8 @@ public void setBeanClassLoader(ClassLoader classLoader) {
6268
@Bean
6369
@ConditionalOnMissingBean
6470
ClientHttpConnectorBuilder<?> clientHttpConnectorBuilder(
65-
HttpReactiveClientSettingsProperties httpReactiveClientSettingsProperties,
6671
ObjectProvider<ClientHttpConnectorBuilderCustomizer<?>> clientHttpConnectorBuilderCustomizers) {
67-
ClientHttpConnectorBuilder<?> builder = httpReactiveClientSettingsProperties
68-
.connectorBuilder(this.beanClassLoader);
72+
ClientHttpConnectorBuilder<?> builder = this.connectors.builder(this.beanClassLoader);
6973
return customize(builder, clientHttpConnectorBuilderCustomizers.orderedStream().toList());
7074
}
7175

@@ -80,12 +84,8 @@ private ClientHttpConnectorBuilder<?> customize(ClientHttpConnectorBuilder<?> bu
8084

8185
@Bean
8286
@ConditionalOnMissingBean
83-
ClientHttpConnectorSettings clientHttpConnectorSettings(
84-
HttpReactiveClientSettingsProperties httpReactiveClientSettingsProperties,
85-
ObjectProvider<SslBundles> sslBundles) {
86-
HttpClientSettings settings = httpReactiveClientSettingsProperties.httpClientSettings(sslBundles);
87-
return new ClientHttpConnectorSettings(settings.redirects(), settings.connectTimeout(), settings.readTimeout(),
88-
settings.sslBundle());
87+
ClientHttpConnectorSettings clientHttpConnectorSettings() {
88+
return this.connectors.settings();
8989
}
9090

9191
@Bean

0 commit comments

Comments
 (0)