From 5906185fd892e505f937adfbf53c443a9f289ceb Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 15 Oct 2025 14:20:27 +0200 Subject: [PATCH] Improve null-safety of module/spring-boot-web-server See gh-47263 --- .../boot/jetty/servlet/JettyServletWebServerFactory.java | 2 ++ .../SessionDataMongoAutoConfigurationTests.java | 3 ++- .../boot/tomcat/servlet/TomcatServletWebServerFactory.java | 2 ++ .../springframework/boot/web/server/servlet/Session.java | 6 +++--- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/module/spring-boot-jetty/src/main/java/org/springframework/boot/jetty/servlet/JettyServletWebServerFactory.java b/module/spring-boot-jetty/src/main/java/org/springframework/boot/jetty/servlet/JettyServletWebServerFactory.java index 0242aaccdaf..b673c8d2a80 100644 --- a/module/spring-boot-jetty/src/main/java/org/springframework/boot/jetty/servlet/JettyServletWebServerFactory.java +++ b/module/spring-boot-jetty/src/main/java/org/springframework/boot/jetty/servlet/JettyServletWebServerFactory.java @@ -89,6 +89,7 @@ import org.springframework.boot.web.server.servlet.ServletWebServerSettings; import org.springframework.boot.web.servlet.ServletContextInitializer; import org.springframework.context.ResourceLoaderAware; import org.springframework.core.io.ResourceLoader; +import org.springframework.lang.Contract; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.CollectionUtils; @@ -263,6 +264,7 @@ public class JettyServletWebServerFactory extends JettyWebServerFactory } } + @Contract("null -> true") private boolean isNegative(@Nullable Duration sessionTimeout) { return sessionTimeout == null || sessionTimeout.isNegative(); } diff --git a/module/spring-boot-session-data-mongodb/src/dockerTest/java/org/springframework/boot/session/data/mongodb/autoconfigure/SessionDataMongoAutoConfigurationTests.java b/module/spring-boot-session-data-mongodb/src/dockerTest/java/org/springframework/boot/session/data/mongodb/autoconfigure/SessionDataMongoAutoConfigurationTests.java index 57f19a64c97..8e93e04bf78 100644 --- a/module/spring-boot-session-data-mongodb/src/dockerTest/java/org/springframework/boot/session/data/mongodb/autoconfigure/SessionDataMongoAutoConfigurationTests.java +++ b/module/spring-boot-session-data-mongodb/src/dockerTest/java/org/springframework/boot/session/data/mongodb/autoconfigure/SessionDataMongoAutoConfigurationTests.java @@ -18,6 +18,7 @@ package org.springframework.boot.session.data.mongodb.autoconfigure; import java.time.Duration; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.testcontainers.containers.MongoDBContainer; @@ -90,7 +91,7 @@ class SessionDataMongoAutoConfigurationTests extends AbstractSessionAutoConfigur } private ContextConsumer validateSpringSessionUsesMongo(String collectionName, - Duration timeout) { + @Nullable Duration timeout) { return (context) -> { MongoIndexedSessionRepository repository = validateSessionRepository(context, MongoIndexedSessionRepository.class); diff --git a/module/spring-boot-tomcat/src/main/java/org/springframework/boot/tomcat/servlet/TomcatServletWebServerFactory.java b/module/spring-boot-tomcat/src/main/java/org/springframework/boot/tomcat/servlet/TomcatServletWebServerFactory.java index e62635bd984..5297b1fb096 100644 --- a/module/spring-boot-tomcat/src/main/java/org/springframework/boot/tomcat/servlet/TomcatServletWebServerFactory.java +++ b/module/spring-boot-tomcat/src/main/java/org/springframework/boot/tomcat/servlet/TomcatServletWebServerFactory.java @@ -85,6 +85,7 @@ import org.springframework.boot.web.server.servlet.ServletWebServerSettings; import org.springframework.boot.web.servlet.ServletContextInitializer; import org.springframework.context.ResourceLoaderAware; import org.springframework.core.io.ResourceLoader; +import org.springframework.lang.Contract; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.CollectionUtils; @@ -382,6 +383,7 @@ public class TomcatServletWebServerFactory extends TomcatWebServerFactory return Math.max(sessionTimeout.toMinutes(), 1); } + @Contract("null -> true") private boolean isZeroOrLess(@Nullable Duration sessionTimeout) { return sessionTimeout == null || sessionTimeout.isNegative() || sessionTimeout.isZero(); } diff --git a/module/spring-boot-web-server/src/main/java/org/springframework/boot/web/server/servlet/Session.java b/module/spring-boot-web-server/src/main/java/org/springframework/boot/web/server/servlet/Session.java index b2c3477143c..889cf9c3e50 100644 --- a/module/spring-boot-web-server/src/main/java/org/springframework/boot/web/server/servlet/Session.java +++ b/module/spring-boot-web-server/src/main/java/org/springframework/boot/web/server/servlet/Session.java @@ -41,7 +41,7 @@ public class Session { * Session timeout. If a duration suffix is not specified, seconds will be used. */ @DurationUnit(ChronoUnit.SECONDS) - private Duration timeout = Duration.ofMinutes(30); + private @Nullable Duration timeout = Duration.ofMinutes(30); /** * Session tracking modes. @@ -63,11 +63,11 @@ public class Session { private final SessionStoreDirectory sessionStoreDirectory = new SessionStoreDirectory(); - public Duration getTimeout() { + public @Nullable Duration getTimeout() { return this.timeout; } - public void setTimeout(Duration timeout) { + public void setTimeout(@Nullable Duration timeout) { this.timeout = timeout; }