From a8bf3c160961655934318dcab6220823462f9bd9 Mon Sep 17 00:00:00 2001 From: Sebastien Tardif Date: Sun, 3 May 2026 08:23:34 -0700 Subject: [PATCH] Replace thread-unsafe SimpleDateFormat with DateTimeFormatter The static SimpleDateFormat instance in AbstractMockHttpServletRequestBuilder is shared across all instances. SimpleDateFormat.format() mutates internal Calendar state and is not thread-safe, which can produce corrupt date strings or ArrayIndexOutOfBoundsException when tests run in parallel. Replace with DateTimeFormatter which is immutable and thread-safe. Signed-off-by: Sebastien Tardif --- .../AbstractMockHttpServletRequestBuilder.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/spring-test/src/main/java/org/springframework/test/web/servlet/request/AbstractMockHttpServletRequestBuilder.java b/spring-test/src/main/java/org/springframework/test/web/servlet/request/AbstractMockHttpServletRequestBuilder.java index fe74c01c312a..f7e51214a273 100644 --- a/spring-test/src/main/java/org/springframework/test/web/servlet/request/AbstractMockHttpServletRequestBuilder.java +++ b/spring-test/src/main/java/org/springframework/test/web/servlet/request/AbstractMockHttpServletRequestBuilder.java @@ -25,8 +25,9 @@ import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.security.Principal; -import java.text.SimpleDateFormat; +import java.time.ZoneId; import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -35,7 +36,6 @@ import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.TimeZone; import java.util.function.Consumer; import jakarta.servlet.ServletContext; @@ -90,12 +90,9 @@ public abstract class AbstractMockHttpServletRequestBuilder> implements ConfigurableSmartRequestBuilder, Mergeable { - private static final SimpleDateFormat simpleDateFormat; - - static { - simpleDateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US); - simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); - } + private static final DateTimeFormatter DATE_FORMAT = + DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US) + .withZone(ZoneId.of("GMT")); private final HttpMethod method; @@ -401,7 +398,7 @@ public B header(String name, Object... values) { for (Object value : values) { if (value instanceof Date date) { - this.headers.add(name, simpleDateFormat.format(date)); + this.headers.add(name, DATE_FORMAT.format(date.toInstant())); } else { this.headers.add(name, String.valueOf(value));