Skip to content

Commit 9918abf

Browse files
committed
Add nullability annotations to module/spring-boot-restclient
See gh-46587
1 parent 0efeea6 commit 9918abf

15 files changed

+96
-55
lines changed

module/spring-boot-restclient/src/main/java/org/springframework/boot/restclient/BasicAuthentication.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
import java.nio.charset.Charset;
2020

21+
import org.jspecify.annotations.Nullable;
22+
2123
import org.springframework.http.HttpHeaders;
2224
import org.springframework.util.Assert;
2325

@@ -33,9 +35,9 @@ class BasicAuthentication {
3335

3436
private final String password;
3537

36-
private final Charset charset;
38+
private final @Nullable Charset charset;
3739

38-
BasicAuthentication(String username, String password, Charset charset) {
40+
BasicAuthentication(String username, String password, @Nullable Charset charset) {
3941
Assert.notNull(username, "'username' must not be null");
4042
Assert.notNull(password, "'password' must not be null");
4143
this.username = username;

module/spring-boot-restclient/src/main/java/org/springframework/boot/restclient/RestTemplateBuilder.java

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
import java.util.function.Supplier;
3131
import java.util.function.UnaryOperator;
3232

33+
import org.jspecify.annotations.Nullable;
34+
3335
import org.springframework.beans.BeanUtils;
3436
import org.springframework.boot.http.client.ClientHttpRequestFactoryBuilder;
3537
import org.springframework.boot.http.client.ClientHttpRequestFactorySettings;
@@ -74,19 +76,19 @@ public class RestTemplateBuilder {
7476

7577
private final boolean detectRequestFactory;
7678

77-
private final String rootUri;
79+
private final @Nullable String rootUri;
7880

79-
private final Set<HttpMessageConverter<?>> messageConverters;
81+
private final @Nullable Set<HttpMessageConverter<?>> messageConverters;
8082

8183
private final Set<ClientHttpRequestInterceptor> interceptors;
8284

83-
private final ClientHttpRequestFactoryBuilder<?> requestFactoryBuilder;
85+
private final @Nullable ClientHttpRequestFactoryBuilder<?> requestFactoryBuilder;
8486

85-
private final UriTemplateHandler uriTemplateHandler;
87+
private final @Nullable UriTemplateHandler uriTemplateHandler;
8688

87-
private final ResponseErrorHandler errorHandler;
89+
private final @Nullable ResponseErrorHandler errorHandler;
8890

89-
private final BasicAuthentication basicAuthentication;
91+
private final @Nullable BasicAuthentication basicAuthentication;
9092

9193
private final Map<String, List<String>> defaultHeaders;
9294

@@ -116,10 +118,11 @@ public RestTemplateBuilder(RestTemplateCustomizer... customizers) {
116118
}
117119

118120
private RestTemplateBuilder(ClientHttpRequestFactorySettings requestFactorySettings, boolean detectRequestFactory,
119-
String rootUri, Set<HttpMessageConverter<?>> messageConverters,
120-
Set<ClientHttpRequestInterceptor> interceptors, ClientHttpRequestFactoryBuilder<?> requestFactoryBuilder,
121-
UriTemplateHandler uriTemplateHandler, ResponseErrorHandler errorHandler,
122-
BasicAuthentication basicAuthentication, Map<String, List<String>> defaultHeaders,
121+
@Nullable String rootUri, @Nullable Set<HttpMessageConverter<?>> messageConverters,
122+
Set<ClientHttpRequestInterceptor> interceptors,
123+
@Nullable ClientHttpRequestFactoryBuilder<?> requestFactoryBuilder,
124+
@Nullable UriTemplateHandler uriTemplateHandler, @Nullable ResponseErrorHandler errorHandler,
125+
@Nullable BasicAuthentication basicAuthentication, Map<String, List<String>> defaultHeaders,
123126
Set<RestTemplateCustomizer> customizers, Set<RestTemplateRequestCustomizer<?>> requestCustomizers) {
124127
this.requestFactorySettings = requestFactorySettings;
125128
this.detectRequestFactory = detectRequestFactory;
@@ -156,7 +159,7 @@ public RestTemplateBuilder detectRequestFactory(boolean detectRequestFactory) {
156159
* @param rootUri the root URI or {@code null}
157160
* @return a new builder instance
158161
*/
159-
public RestTemplateBuilder rootUri(String rootUri) {
162+
public RestTemplateBuilder rootUri(@Nullable String rootUri) {
160163
return new RestTemplateBuilder(this.requestFactorySettings, this.detectRequestFactory, rootUri,
161164
this.messageConverters, this.interceptors, this.requestFactoryBuilder, this.uriTemplateHandler,
162165
this.errorHandler, this.basicAuthentication, this.defaultHeaders, this.customizers,
@@ -390,7 +393,7 @@ public RestTemplateBuilder basicAuthentication(String username, String password)
390393
* @return a new builder instance
391394
* @since 2.2.0
392395
*/
393-
public RestTemplateBuilder basicAuthentication(String username, String password, Charset charset) {
396+
public RestTemplateBuilder basicAuthentication(String username, String password, @Nullable Charset charset) {
394397
return new RestTemplateBuilder(this.requestFactorySettings, this.detectRequestFactory, this.rootUri,
395398
this.messageConverters, this.interceptors, this.requestFactoryBuilder, this.uriTemplateHandler,
396399
this.errorHandler, new BasicAuthentication(username, password, charset), this.defaultHeaders,
@@ -688,7 +691,7 @@ public <T extends RestTemplate> T configure(T restTemplate) {
688691
* @return a {@link ClientHttpRequestFactory} or {@code null}
689692
* @since 2.2.0
690693
*/
691-
public ClientHttpRequestFactory buildRequestFactory() {
694+
public @Nullable ClientHttpRequestFactory buildRequestFactory() {
692695
ClientHttpRequestFactoryBuilder<?> requestFactoryBuilder = requestFactoryBuilder();
693696
return (requestFactoryBuilder != null) ? requestFactoryBuilder.build(this.requestFactorySettings) : null;
694697
}
@@ -699,7 +702,7 @@ public ClientHttpRequestFactory buildRequestFactory() {
699702
* @return a {@link ClientHttpRequestFactoryBuilder} or {@code null}
700703
* @since 3.5.0
701704
*/
702-
public ClientHttpRequestFactoryBuilder<?> requestFactoryBuilder() {
705+
public @Nullable ClientHttpRequestFactoryBuilder<?> requestFactoryBuilder() {
703706
if (this.requestFactoryBuilder != null) {
704707
return this.requestFactoryBuilder;
705708
}
@@ -731,15 +734,16 @@ private static <T> List<T> copiedListOf(T[] items) {
731734
return Collections.unmodifiableList(Arrays.asList(Arrays.copyOf(items, items.length)));
732735
}
733736

734-
private static <T> Set<T> append(Collection<? extends T> collection, Collection<? extends T> additions) {
737+
private static <T> Set<T> append(@Nullable Collection<? extends T> collection,
738+
@Nullable Collection<? extends T> additions) {
735739
Set<T> result = new LinkedHashSet<>((collection != null) ? collection : Collections.emptySet());
736740
if (additions != null) {
737741
result.addAll(additions);
738742
}
739743
return Collections.unmodifiableSet(result);
740744
}
741745

742-
private static <K, V> Map<K, List<V>> append(Map<K, List<V>> map, K key, V[] values) {
746+
private static <K, V> Map<K, List<V>> append(@Nullable Map<K, List<V>> map, K key, V @Nullable [] values) {
743747
Map<K, List<V>> result = new LinkedHashMap<>((map != null) ? map : Collections.emptyMap());
744748
if (values != null) {
745749
result.put(key, copiedListOf(values));

module/spring-boot-restclient/src/main/java/org/springframework/boot/restclient/RestTemplateBuilderClientHttpRequestInitializer.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import java.util.Map;
2121
import java.util.Set;
2222

23+
import org.jspecify.annotations.Nullable;
24+
2325
import org.springframework.boot.util.LambdaSafe;
2426
import org.springframework.http.HttpHeaders;
2527
import org.springframework.http.client.ClientHttpRequest;
@@ -34,13 +36,13 @@
3436
*/
3537
class RestTemplateBuilderClientHttpRequestInitializer implements ClientHttpRequestInitializer {
3638

37-
private final BasicAuthentication basicAuthentication;
39+
private final @Nullable BasicAuthentication basicAuthentication;
3840

3941
private final Map<String, List<String>> defaultHeaders;
4042

4143
private final Set<RestTemplateRequestCustomizer<?>> requestCustomizers;
4244

43-
RestTemplateBuilderClientHttpRequestInitializer(BasicAuthentication basicAuthentication,
45+
RestTemplateBuilderClientHttpRequestInitializer(@Nullable BasicAuthentication basicAuthentication,
4446
Map<String, List<String>> defaultHeaders, Set<RestTemplateRequestCustomizer<?>> requestCustomizers) {
4547
this.basicAuthentication = basicAuthentication;
4648
this.defaultHeaders = defaultHeaders;

module/spring-boot-restclient/src/main/java/org/springframework/boot/restclient/RootUriTemplateHandler.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import java.net.URI;
2020
import java.util.Map;
2121

22+
import org.jspecify.annotations.Nullable;
23+
2224
import org.springframework.util.Assert;
2325
import org.springframework.util.StringUtils;
2426
import org.springframework.web.util.UriTemplateHandler;
@@ -32,7 +34,7 @@
3234
*/
3335
public class RootUriTemplateHandler implements UriTemplateHandler {
3436

35-
private final String rootUri;
37+
private final @Nullable String rootUri;
3638

3739
private final UriTemplateHandler handler;
3840

@@ -55,7 +57,7 @@ public URI expand(String uriTemplate, Map<String, ?> uriVariables) {
5557
}
5658

5759
@Override
58-
public URI expand(String uriTemplate, Object... uriVariables) {
60+
public URI expand(String uriTemplate, @Nullable Object... uriVariables) {
5961
return this.handler.expand(apply(uriTemplate), uriVariables);
6062
}
6163

@@ -66,7 +68,7 @@ String apply(String uriTemplate) {
6668
return uriTemplate;
6769
}
6870

69-
public String getRootUri() {
71+
public @Nullable String getRootUri() {
7072
return this.rootUri;
7173
}
7274

module/spring-boot-restclient/src/main/java/org/springframework/boot/restclient/autoconfigure/AbstractRestClientProperties.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import java.util.List;
2121
import java.util.Map;
2222

23+
import org.jspecify.annotations.Nullable;
24+
2325
import org.springframework.boot.context.properties.NestedConfigurationProperty;
2426
import org.springframework.boot.http.client.autoconfigure.AbstractHttpRequestFactoryProperties;
2527
import org.springframework.boot.http.client.autoconfigure.ApiversionProperties;
@@ -40,7 +42,7 @@ public abstract class AbstractRestClientProperties extends AbstractHttpRequestFa
4042
* Base url to set in the underlying HTTP client group. By default, set to
4143
* {@code null}.
4244
*/
43-
private String baseUrl;
45+
private @Nullable String baseUrl;
4446

4547
/**
4648
* Default request headers for interface client group. By default, set to empty
@@ -54,11 +56,11 @@ public abstract class AbstractRestClientProperties extends AbstractHttpRequestFa
5456
@NestedConfigurationProperty
5557
private final ApiversionProperties apiversion = new ApiversionProperties();
5658

57-
public String getBaseUrl() {
59+
public @Nullable String getBaseUrl() {
5860
return this.baseUrl;
5961
}
6062

61-
public void setBaseUrl(String baseUrl) {
63+
public void setBaseUrl(@Nullable String baseUrl) {
6264
this.baseUrl = baseUrl;
6365
}
6466

module/spring-boot-restclient/src/main/java/org/springframework/boot/restclient/autoconfigure/HttpMessageConvertersRestClientCustomizer.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import java.util.Arrays;
2020
import java.util.List;
2121

22+
import org.jspecify.annotations.Nullable;
23+
2224
import org.springframework.boot.http.converter.autoconfigure.HttpMessageConverters;
2325
import org.springframework.boot.restclient.RestClientCustomizer;
2426
import org.springframework.http.converter.HttpMessageConverter;
@@ -34,14 +36,14 @@
3436
*/
3537
public class HttpMessageConvertersRestClientCustomizer implements RestClientCustomizer {
3638

37-
private final Iterable<? extends HttpMessageConverter<?>> messageConverters;
39+
private final @Nullable Iterable<? extends HttpMessageConverter<?>> messageConverters;
3840

3941
public HttpMessageConvertersRestClientCustomizer(HttpMessageConverter<?>... messageConverters) {
4042
Assert.notNull(messageConverters, "'messageConverters' must not be null");
4143
this.messageConverters = Arrays.asList(messageConverters);
4244
}
4345

44-
HttpMessageConvertersRestClientCustomizer(HttpMessageConverters messageConverters) {
46+
HttpMessageConvertersRestClientCustomizer(@Nullable HttpMessageConverters messageConverters) {
4547
this.messageConverters = messageConverters;
4648
}
4749

module/spring-boot-restclient/src/main/java/org/springframework/boot/restclient/autoconfigure/PropertiesRestClientCustomizer.java

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import java.util.Map;
2222
import java.util.function.Consumer;
2323

24+
import org.jspecify.annotations.Nullable;
25+
2426
import org.springframework.boot.context.properties.PropertyMapper;
2527
import org.springframework.boot.http.client.autoconfigure.ApiversionProperties;
2628
import org.springframework.boot.http.client.autoconfigure.PropertiesApiVersionInserter;
@@ -29,6 +31,7 @@
2931
import org.springframework.web.client.ApiVersionFormatter;
3032
import org.springframework.web.client.ApiVersionInserter;
3133
import org.springframework.web.client.RestClient;
34+
import org.springframework.web.client.RestClient.Builder;
3235

3336
/**
3437
* {@link RestClientCustomizer} to apply {@link AbstractRestClientProperties}.
@@ -38,18 +41,19 @@
3841
*/
3942
public class PropertiesRestClientCustomizer implements RestClientCustomizer {
4043

41-
private final AbstractRestClientProperties[] orderedProperties;
44+
private final @Nullable AbstractRestClientProperties[] orderedProperties;
4245

43-
private ApiVersionInserter apiVersionInserter;
46+
private final @Nullable ApiVersionInserter apiVersionInserter;
4447

45-
public PropertiesRestClientCustomizer(ApiVersionInserter apiVersionInserter,
46-
ApiVersionFormatter apiVersionFormatter, AbstractRestClientProperties... orderedProperties) {
48+
public PropertiesRestClientCustomizer(@Nullable ApiVersionInserter apiVersionInserter,
49+
@Nullable ApiVersionFormatter apiVersionFormatter,
50+
@Nullable AbstractRestClientProperties... orderedProperties) {
4751
this.orderedProperties = orderedProperties;
4852
this.apiVersionInserter = PropertiesApiVersionInserter.get(apiVersionInserter, apiVersionFormatter,
4953
Arrays.stream(orderedProperties).map(this::getApiVersion));
5054
}
5155

52-
private ApiversionProperties getApiVersion(AbstractRestClientProperties properties) {
56+
private @Nullable ApiversionProperties getApiVersion(@Nullable AbstractRestClientProperties properties) {
5357
return (properties != null) ? properties.getApiversion() : null;
5458
}
5559

@@ -62,13 +66,16 @@ public void customize(RestClient.Builder builder) {
6266
if (properties != null) {
6367
map.from(properties::getBaseUrl).whenHasText().to(builder::baseUrl);
6468
map.from(properties::getDefaultHeader).as(this::putAllHeaders).to(builder::defaultHeaders);
65-
map.from(properties.getApiversion())
66-
.as(ApiversionProperties::getDefaultVersion)
67-
.to(builder::defaultApiVersion);
69+
setDefaultApiVersion(builder, map, properties);
6870
}
6971
}
7072
}
7173

74+
@SuppressWarnings("NullAway") // Lambda isn't detected with the correct nullability
75+
private void setDefaultApiVersion(Builder builder, PropertyMapper map, AbstractRestClientProperties properties) {
76+
map.from(properties.getApiversion()).as(ApiversionProperties::getDefaultVersion).to(builder::defaultApiVersion);
77+
}
78+
7279
private Consumer<HttpHeaders> putAllHeaders(Map<String, List<String>> defaultHeaders) {
7380
return (httpHeaders) -> httpHeaders.putAll(defaultHeaders);
7481
}

module/spring-boot-restclient/src/main/java/org/springframework/boot/restclient/autoconfigure/RestClientBuilderConfigurer.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import java.util.Collections;
2020
import java.util.List;
2121

22+
import org.jspecify.annotations.Nullable;
23+
2224
import org.springframework.boot.http.client.ClientHttpRequestFactoryBuilder;
2325
import org.springframework.boot.http.client.ClientHttpRequestFactorySettings;
2426
import org.springframework.boot.restclient.RestClientCustomizer;
@@ -43,7 +45,7 @@ public class RestClientBuilderConfigurer {
4345

4446
private final List<RestClientCustomizer> customizers;
4547

46-
private final PropertiesRestClientCustomizer propertiesCustomizer;
48+
private final @Nullable PropertiesRestClientCustomizer propertiesCustomizer;
4749

4850
public RestClientBuilderConfigurer() {
4951
this(ClientHttpRequestFactoryBuilder.detect(), ClientHttpRequestFactorySettings.defaults(), null,
@@ -52,7 +54,7 @@ public RestClientBuilderConfigurer() {
5254

5355
RestClientBuilderConfigurer(ClientHttpRequestFactoryBuilder<?> requestFactoryBuilder,
5456
ClientHttpRequestFactorySettings requestFactorySettings,
55-
PropertiesRestClientCustomizer propertiesCustomizer, List<RestClientCustomizer> customizers) {
57+
@Nullable PropertiesRestClientCustomizer propertiesCustomizer, List<RestClientCustomizer> customizers) {
5658
this.requestFactoryBuilder = requestFactoryBuilder;
5759
this.requestFactorySettings = requestFactorySettings;
5860
this.propertiesCustomizer = propertiesCustomizer;

module/spring-boot-restclient/src/main/java/org/springframework/boot/restclient/autoconfigure/RestTemplateBuilderConfigurer.java

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import java.util.List;
2121
import java.util.function.BiFunction;
2222

23+
import org.jspecify.annotations.Nullable;
24+
2325
import org.springframework.boot.http.client.ClientHttpRequestFactoryBuilder;
2426
import org.springframework.boot.http.client.ClientHttpRequestFactorySettings;
2527
import org.springframework.boot.http.converter.autoconfigure.HttpMessageConverters;
@@ -40,33 +42,34 @@
4042
*/
4143
public final class RestTemplateBuilderConfigurer {
4244

43-
private ClientHttpRequestFactoryBuilder<?> requestFactoryBuilder;
45+
private @Nullable ClientHttpRequestFactoryBuilder<?> requestFactoryBuilder;
4446

45-
private ClientHttpRequestFactorySettings requestFactorySettings;
47+
private @Nullable ClientHttpRequestFactorySettings requestFactorySettings;
4648

47-
private HttpMessageConverters httpMessageConverters;
49+
private @Nullable HttpMessageConverters httpMessageConverters;
4850

49-
private List<RestTemplateCustomizer> restTemplateCustomizers;
51+
private @Nullable List<RestTemplateCustomizer> restTemplateCustomizers;
5052

51-
private List<RestTemplateRequestCustomizer<?>> restTemplateRequestCustomizers;
53+
private @Nullable List<RestTemplateRequestCustomizer<?>> restTemplateRequestCustomizers;
5254

53-
void setRequestFactoryBuilder(ClientHttpRequestFactoryBuilder<?> requestFactoryBuilder) {
55+
void setRequestFactoryBuilder(@Nullable ClientHttpRequestFactoryBuilder<?> requestFactoryBuilder) {
5456
this.requestFactoryBuilder = requestFactoryBuilder;
5557
}
5658

57-
void setRequestFactorySettings(ClientHttpRequestFactorySettings requestFactorySettings) {
59+
void setRequestFactorySettings(@Nullable ClientHttpRequestFactorySettings requestFactorySettings) {
5860
this.requestFactorySettings = requestFactorySettings;
5961
}
6062

61-
void setHttpMessageConverters(HttpMessageConverters httpMessageConverters) {
63+
void setHttpMessageConverters(@Nullable HttpMessageConverters httpMessageConverters) {
6264
this.httpMessageConverters = httpMessageConverters;
6365
}
6466

65-
void setRestTemplateCustomizers(List<RestTemplateCustomizer> restTemplateCustomizers) {
67+
void setRestTemplateCustomizers(@Nullable List<RestTemplateCustomizer> restTemplateCustomizers) {
6668
this.restTemplateCustomizers = restTemplateCustomizers;
6769
}
6870

69-
void setRestTemplateRequestCustomizers(List<RestTemplateRequestCustomizer<?>> restTemplateRequestCustomizers) {
71+
void setRestTemplateRequestCustomizers(
72+
@Nullable List<RestTemplateRequestCustomizer<?>> restTemplateRequestCustomizers) {
7073
this.restTemplateRequestCustomizers = restTemplateRequestCustomizers;
7174
}
7275

@@ -91,7 +94,7 @@ public RestTemplateBuilder configure(RestTemplateBuilder builder) {
9194
return builder;
9295
}
9396

94-
private <T> RestTemplateBuilder addCustomizers(RestTemplateBuilder builder, List<T> customizers,
97+
private <T> RestTemplateBuilder addCustomizers(RestTemplateBuilder builder, @Nullable List<T> customizers,
9598
BiFunction<RestTemplateBuilder, Collection<T>, RestTemplateBuilder> method) {
9699
if (!ObjectUtils.isEmpty(customizers)) {
97100
return method.apply(builder, customizers);

0 commit comments

Comments
 (0)