diff --git a/module/spring-boot-http-client/src/main/java/org/springframework/boot/http/client/autoconfigure/reactive/ClientHttpConnectors.java b/module/spring-boot-http-client/src/main/java/org/springframework/boot/http/client/autoconfigure/reactive/ClientHttpConnectors.java index 132b426096c..a61e2e8b931 100644 --- a/module/spring-boot-http-client/src/main/java/org/springframework/boot/http/client/autoconfigure/reactive/ClientHttpConnectors.java +++ b/module/spring-boot-http-client/src/main/java/org/springframework/boot/http/client/autoconfigure/reactive/ClientHttpConnectors.java @@ -44,10 +44,10 @@ public final class ClientHttpConnectors { private final ObjectFactory sslBundles; - private final AbstractClientHttpConnectorProperties[] orderedProperties; + private final @Nullable AbstractClientHttpConnectorProperties[] orderedProperties; public ClientHttpConnectors(ObjectFactory sslBundles, - AbstractClientHttpConnectorProperties... orderedProperties) { + @Nullable AbstractClientHttpConnectorProperties... orderedProperties) { this.sslBundles = sslBundles; this.orderedProperties = orderedProperties; } diff --git a/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/autoconfigure/AbstractWebClientProperties.java b/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/autoconfigure/AbstractWebClientProperties.java index 0f48a87586c..7b1693342c2 100644 --- a/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/autoconfigure/AbstractWebClientProperties.java +++ b/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/autoconfigure/AbstractWebClientProperties.java @@ -20,6 +20,8 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import org.jspecify.annotations.Nullable; + import org.springframework.boot.context.properties.NestedConfigurationProperty; import org.springframework.boot.http.client.autoconfigure.ApiversionProperties; import org.springframework.boot.http.client.autoconfigure.reactive.AbstractClientHttpConnectorProperties; @@ -40,7 +42,7 @@ public abstract class AbstractWebClientProperties extends AbstractClientHttpConn * Base url to set in the underlying HTTP client group. By default, set to * {@code null}. */ - private String baseUrl; + private @Nullable String baseUrl; /** * Default request headers for interface client group. By default, set to empty @@ -54,11 +56,11 @@ public abstract class AbstractWebClientProperties extends AbstractClientHttpConn @NestedConfigurationProperty private final ApiversionProperties apiversion = new ApiversionProperties(); - public String getBaseUrl() { + public @Nullable String getBaseUrl() { return this.baseUrl; } - public void setBaseUrl(String baseUrl) { + public void setBaseUrl(@Nullable String baseUrl) { this.baseUrl = baseUrl; } diff --git a/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/autoconfigure/PropertiesWebClientCustomizer.java b/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/autoconfigure/PropertiesWebClientCustomizer.java index b0b3efe799b..8ab858274cd 100644 --- a/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/autoconfigure/PropertiesWebClientCustomizer.java +++ b/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/autoconfigure/PropertiesWebClientCustomizer.java @@ -21,6 +21,8 @@ import java.util.List; import java.util.Map; import java.util.function.Consumer; +import org.jspecify.annotations.Nullable; + import org.springframework.boot.context.properties.PropertyMapper; import org.springframework.boot.http.client.autoconfigure.ApiversionProperties; import org.springframework.boot.http.client.autoconfigure.PropertiesApiVersionInserter; @@ -29,6 +31,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.web.client.ApiVersionFormatter; import org.springframework.web.client.ApiVersionInserter; import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.reactive.function.client.WebClient.Builder; /** * {@link WebClientCustomizer} to apply {@link AbstractWebClientProperties}. @@ -38,18 +41,19 @@ import org.springframework.web.reactive.function.client.WebClient; */ public class PropertiesWebClientCustomizer implements WebClientCustomizer { - private final AbstractWebClientProperties[] orderedProperties; + private final @Nullable AbstractWebClientProperties[] orderedProperties; - private ApiVersionInserter apiVersionInserter; + private final @Nullable ApiVersionInserter apiVersionInserter; - public PropertiesWebClientCustomizer(ApiVersionInserter apiVersionInserter, ApiVersionFormatter apiVersionFormatter, - AbstractWebClientProperties... orderedProperties) { + public PropertiesWebClientCustomizer(@Nullable ApiVersionInserter apiVersionInserter, + @Nullable ApiVersionFormatter apiVersionFormatter, + @Nullable AbstractWebClientProperties... orderedProperties) { this.orderedProperties = orderedProperties; this.apiVersionInserter = PropertiesApiVersionInserter.get(apiVersionInserter, apiVersionFormatter, Arrays.stream(orderedProperties).map(this::getApiVersion)); } - private ApiversionProperties getApiVersion(AbstractWebClientProperties properties) { + private @Nullable ApiversionProperties getApiVersion(@Nullable AbstractWebClientProperties properties) { return (properties != null) ? properties.getApiversion() : null; } @@ -62,13 +66,16 @@ public class PropertiesWebClientCustomizer implements WebClientCustomizer { if (properties != null) { map.from(properties::getBaseUrl).whenHasText().to(builder::baseUrl); map.from(properties::getDefaultHeader).as(this::putAllHeaders).to(builder::defaultHeaders); - map.from(properties.getApiversion()) - .as(ApiversionProperties::getDefaultVersion) - .to(builder::defaultApiVersion); + setDefaultApiVersion(builder, map, properties); } } } + @SuppressWarnings("NullAway") // Lambda isn't detected with the correct nullability + private void setDefaultApiVersion(Builder builder, PropertyMapper map, AbstractWebClientProperties properties) { + map.from(properties.getApiversion()).as(ApiversionProperties::getDefaultVersion).to(builder::defaultApiVersion); + } + private Consumer putAllHeaders(Map> defaultHeaders) { return (httpHeaders) -> httpHeaders.putAll(defaultHeaders); } diff --git a/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/autoconfigure/package-info.java b/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/autoconfigure/package-info.java index e02cfd7d466..ddb0a17ea76 100644 --- a/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/autoconfigure/package-info.java +++ b/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/autoconfigure/package-info.java @@ -17,4 +17,7 @@ /** * Auto-configuration for Spring Framework's functional web client. */ +@NullMarked package org.springframework.boot.webclient.autoconfigure; + +import org.jspecify.annotations.NullMarked; diff --git a/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/autoconfigure/service/ReactiveHttpServiceClientAutoConfiguration.java b/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/autoconfigure/service/ReactiveHttpServiceClientAutoConfiguration.java index 3584b5893e5..e3a968967b5 100644 --- a/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/autoconfigure/service/ReactiveHttpServiceClientAutoConfiguration.java +++ b/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/autoconfigure/service/ReactiveHttpServiceClientAutoConfiguration.java @@ -53,6 +53,7 @@ import org.springframework.web.service.registry.ImportHttpServices; @EnableConfigurationProperties(ReactiveHttpClientServiceProperties.class) public final class ReactiveHttpServiceClientAutoConfiguration implements BeanClassLoaderAware { + @SuppressWarnings("NullAway.Init") private ClassLoader beanClassLoader; ReactiveHttpServiceClientAutoConfiguration() { diff --git a/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/autoconfigure/service/WebClientPropertiesHttpServiceGroupConfigurer.java b/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/autoconfigure/service/WebClientPropertiesHttpServiceGroupConfigurer.java index fb3e80ffca4..261996f3cc1 100644 --- a/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/autoconfigure/service/WebClientPropertiesHttpServiceGroupConfigurer.java +++ b/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/autoconfigure/service/WebClientPropertiesHttpServiceGroupConfigurer.java @@ -16,6 +16,8 @@ package org.springframework.boot.webclient.autoconfigure.service; +import org.jspecify.annotations.Nullable; + import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.http.client.autoconfigure.reactive.ClientHttpConnectors; import org.springframework.boot.http.client.autoconfigure.reactive.HttpReactiveClientProperties; @@ -54,9 +56,9 @@ class WebClientPropertiesHttpServiceGroupConfigurer implements WebClientHttpServ private final ObjectProvider clientConnectorSettings; - private final ApiVersionInserter apiVersionInserter; + private final @Nullable ApiVersionInserter apiVersionInserter; - private final ApiVersionFormatter apiVersionFormatter; + private final @Nullable ApiVersionFormatter apiVersionFormatter; WebClientPropertiesHttpServiceGroupConfigurer(ClassLoader classLoader, ObjectProvider sslBundles, HttpReactiveClientProperties clientProperties, ReactiveHttpClientServiceProperties serviceProperties, @@ -91,12 +93,13 @@ class WebClientPropertiesHttpServiceGroupConfigurer implements WebClientHttpServ } private PropertiesWebClientCustomizer getPropertiesWebClientCustomizer( - ReactiveHttpClientServiceProperties.Group groupProperties) { + ReactiveHttpClientServiceProperties.@Nullable Group groupProperties) { return new PropertiesWebClientCustomizer(this.apiVersionInserter, this.apiVersionFormatter, groupProperties, this.serviceProperties); } - private ClientHttpConnector getClientConnector(ReactiveHttpClientServiceProperties.Group groupProperties) { + private ClientHttpConnector getClientConnector( + ReactiveHttpClientServiceProperties.@Nullable Group groupProperties) { ClientHttpConnectors connectors = new ClientHttpConnectors(this.sslBundles, groupProperties, this.serviceProperties, this.clientProperties); ClientHttpConnectorBuilder builder = this.clientConnectorBuilder diff --git a/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/autoconfigure/service/package-info.java b/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/autoconfigure/service/package-info.java index 40a27e5241a..e75c2fbeaf9 100644 --- a/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/autoconfigure/service/package-info.java +++ b/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/autoconfigure/service/package-info.java @@ -17,4 +17,7 @@ /** * Auto-Configuration for Spring's Reactive HTTP Service Interface Clients. */ +@NullMarked package org.springframework.boot.webclient.autoconfigure.service; + +import org.jspecify.annotations.NullMarked; diff --git a/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/observation/package-info.java b/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/observation/package-info.java index da275c440ad..416a4aa631b 100644 --- a/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/observation/package-info.java +++ b/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/observation/package-info.java @@ -17,4 +17,7 @@ /** * Observation integration for WebClient. */ +@NullMarked package org.springframework.boot.webclient.observation; + +import org.jspecify.annotations.NullMarked; diff --git a/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/package-info.java b/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/package-info.java index 813f14245f5..34779ca0ed3 100644 --- a/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/package-info.java +++ b/module/spring-boot-webclient/src/main/java/org/springframework/boot/webclient/package-info.java @@ -17,4 +17,7 @@ /** * Spring WebFlux WebClient support abstractions. */ +@NullMarked package org.springframework.boot.webclient; + +import org.jspecify.annotations.NullMarked;