From 1e3f8651b8353d3fe7aba84b10d7be071e620870 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deleuze?= Date: Wed, 1 Oct 2025 10:53:12 +0200 Subject: [PATCH] Refine SingletonSupplier static methods nullability SingletonSupplier supplier-based static methods nullability should be refined to accept in a flexible way nullable or non-nullable T. Closes gh-35559 --- .../jcache/config/AbstractJCacheConfiguration.java | 5 +++-- .../interceptor/DefaultJCacheOperationSource.java | 6 +++--- .../annotation/AbstractCachingConfiguration.java | 14 +++++++++----- .../util/function/SingletonSupplier.java | 6 +++--- .../util/function/SupplierUtils.java | 2 +- 5 files changed, 19 insertions(+), 14 deletions(-) diff --git a/spring-context-support/src/main/java/org/springframework/cache/jcache/config/AbstractJCacheConfiguration.java b/spring-context-support/src/main/java/org/springframework/cache/jcache/config/AbstractJCacheConfiguration.java index 731e0b95513..1d171848a3e 100644 --- a/spring-context-support/src/main/java/org/springframework/cache/jcache/config/AbstractJCacheConfiguration.java +++ b/spring-context-support/src/main/java/org/springframework/cache/jcache/config/AbstractJCacheConfiguration.java @@ -41,11 +41,12 @@ import org.springframework.context.annotation.Role; @Configuration(proxyBeanMethods = false) public abstract class AbstractJCacheConfiguration extends AbstractCachingConfiguration { - protected @Nullable Supplier<@Nullable CacheResolver> exceptionCacheResolver; + @SuppressWarnings("NullAway.Init") + protected Supplier<@Nullable CacheResolver> exceptionCacheResolver; @Override - @SuppressWarnings("NullAway") // https://github.com/uber/NullAway/issues/1128 + @SuppressWarnings("NullAway") // See https://github.com/uber/NullAway/issues/1290 protected void useCachingConfigurer(CachingConfigurerSupplier cachingConfigurerSupplier) { super.useCachingConfigurer(cachingConfigurerSupplier); this.exceptionCacheResolver = cachingConfigurerSupplier.adapt(config -> { diff --git a/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/DefaultJCacheOperationSource.java b/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/DefaultJCacheOperationSource.java index aba3f65c5db..20b72690f3f 100644 --- a/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/DefaultJCacheOperationSource.java +++ b/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/DefaultJCacheOperationSource.java @@ -50,11 +50,11 @@ import org.springframework.util.function.SupplierUtils; public class DefaultJCacheOperationSource extends AnnotationJCacheOperationSource implements BeanFactoryAware, SmartInitializingSingleton { - private @Nullable SingletonSupplier cacheManager; + private @Nullable SingletonSupplier<@Nullable CacheManager> cacheManager; - private @Nullable SingletonSupplier cacheResolver; + private @Nullable SingletonSupplier<@Nullable CacheResolver> cacheResolver; - private @Nullable SingletonSupplier exceptionCacheResolver; + private @Nullable SingletonSupplier<@Nullable CacheResolver> exceptionCacheResolver; private SingletonSupplier keyGenerator; diff --git a/spring-context/src/main/java/org/springframework/cache/annotation/AbstractCachingConfiguration.java b/spring-context/src/main/java/org/springframework/cache/annotation/AbstractCachingConfiguration.java index 2437b5bf6d9..149b5add4f1 100644 --- a/spring-context/src/main/java/org/springframework/cache/annotation/AbstractCachingConfiguration.java +++ b/spring-context/src/main/java/org/springframework/cache/annotation/AbstractCachingConfiguration.java @@ -50,13 +50,17 @@ public abstract class AbstractCachingConfiguration implements ImportAware { protected @Nullable AnnotationAttributes enableCaching; - protected @Nullable Supplier<@Nullable CacheManager> cacheManager; + @SuppressWarnings("NullAway.Init") + protected Supplier<@Nullable CacheManager> cacheManager; - protected @Nullable Supplier<@Nullable CacheResolver> cacheResolver; + @SuppressWarnings("NullAway.Init") + protected Supplier<@Nullable CacheResolver> cacheResolver; - protected @Nullable Supplier<@Nullable KeyGenerator> keyGenerator; + @SuppressWarnings("NullAway.Init") + protected Supplier<@Nullable KeyGenerator> keyGenerator; - protected @Nullable Supplier<@Nullable CacheErrorHandler> errorHandler; + @SuppressWarnings("NullAway.Init") + protected Supplier<@Nullable CacheErrorHandler> errorHandler; @Override @@ -101,7 +105,7 @@ public abstract class AbstractCachingConfiguration implements ImportAware { protected static class CachingConfigurerSupplier { - private final SingletonSupplier supplier; + private final SingletonSupplier<@Nullable CachingConfigurer> supplier; public CachingConfigurerSupplier(Supplier<@Nullable CachingConfigurer> supplier) { this.supplier = SingletonSupplier.ofNullable(supplier); diff --git a/spring-core/src/main/java/org/springframework/util/function/SingletonSupplier.java b/spring-core/src/main/java/org/springframework/util/function/SingletonSupplier.java index 865cc6888a5..f0f63e07439 100644 --- a/spring-core/src/main/java/org/springframework/util/function/SingletonSupplier.java +++ b/spring-core/src/main/java/org/springframework/util/function/SingletonSupplier.java @@ -143,7 +143,7 @@ public class SingletonSupplier implements Supplier null; !null -> !null") - public static @Nullable SingletonSupplier ofNullable(@Nullable T instance) { + public static @Nullable SingletonSupplier ofNullable(T instance) { return (instance != null ? new SingletonSupplier<>(instance) : null); } @@ -152,7 +152,7 @@ public class SingletonSupplier implements Supplier SingletonSupplier of(Supplier supplier) { + public static SingletonSupplier of(Supplier supplier) { return new SingletonSupplier<>(supplier); } @@ -162,7 +162,7 @@ public class SingletonSupplier implements Supplier null; !null -> !null") - public static @Nullable SingletonSupplier ofNullable(@Nullable Supplier<@Nullable T> supplier) { + public static @Nullable SingletonSupplier ofNullable(@Nullable Supplier supplier) { return (supplier != null ? new SingletonSupplier<>(supplier) : null); } diff --git a/spring-core/src/main/java/org/springframework/util/function/SupplierUtils.java b/spring-core/src/main/java/org/springframework/util/function/SupplierUtils.java index 8c7b9230593..e4134d98385 100644 --- a/spring-core/src/main/java/org/springframework/util/function/SupplierUtils.java +++ b/spring-core/src/main/java/org/springframework/util/function/SupplierUtils.java @@ -38,7 +38,7 @@ public abstract class SupplierUtils { * @return the supplier's result, or {@code null} if none */ @Contract("null -> null") - public static @Nullable T resolve(@Nullable Supplier supplier) { + public static @Nullable T resolve(@Nullable Supplier supplier) { return (supplier != null ? supplier.get() : null); }