From b213344d259aabb8a509140f52b156159f5a9c81 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Fri, 12 Sep 2025 09:12:33 +0200 Subject: [PATCH 1/3] Fix synchronization in ResponseBodyEmitter See gh-35423 Fixes gh-35466 (cherry picked from commit 20e1149dde7ff042154e4098d49939a886661c3e) --- .../mvc/method/annotation/ResponseBodyEmitter.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyEmitter.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyEmitter.java index 9867516277d..e0704a2d7ae 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyEmitter.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyEmitter.java @@ -201,10 +201,10 @@ public class ResponseBodyEmitter { * @throws java.lang.IllegalStateException wraps any other errors */ public void send(Object object, @Nullable MediaType mediaType) throws IOException { - Assert.state(!this.complete, () -> "ResponseBodyEmitter has already completed" + - (this.failure != null ? " with error: " + this.failure : "")); this.writeLock.lock(); try { + Assert.state(!this.complete, () -> "ResponseBodyEmitter has already completed" + + (this.failure != null ? " with error: " + this.failure : "")); if (this.handler != null) { try { this.handler.send(object, mediaType); @@ -235,10 +235,10 @@ public class ResponseBodyEmitter { * @since 6.0.12 */ public void send(Set items) throws IOException { - Assert.state(!this.complete, () -> "ResponseBodyEmitter has already completed" + - (this.failure != null ? " with error: " + this.failure : "")); this.writeLock.lock(); try { + Assert.state(!this.complete, () -> "ResponseBodyEmitter has already completed" + + (this.failure != null ? " with error: " + this.failure : "")); sendInternal(items); } finally { From bf715ac23e9900a8a99ce59a2fb1defaa40b2255 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 17 Sep 2025 18:10:19 +0200 Subject: [PATCH 2/3] Polishing --- .../web/servlet/mvc/method/annotation/ResponseBodyEmitter.java | 1 + .../web/servlet/mvc/method/annotation/SseEmitter.java | 1 + 2 files changed, 2 insertions(+) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyEmitter.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyEmitter.java index e0704a2d7ae..fc7fa782ad1 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyEmitter.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyEmitter.java @@ -94,6 +94,7 @@ public class ResponseBodyEmitter { /** Guards access to write operations on the response. */ protected final Lock writeLock = new ReentrantLock(); + /** * Create a new ResponseBodyEmitter instance. */ diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/SseEmitter.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/SseEmitter.java index b9a9d04bf0d..85752eee9e8 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/SseEmitter.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/SseEmitter.java @@ -44,6 +44,7 @@ public class SseEmitter extends ResponseBodyEmitter { private static final MediaType TEXT_PLAIN = new MediaType("text", "plain", StandardCharsets.UTF_8); + /** * Create a new SseEmitter instance. */ From 931686a5ee1b4aa6e102f2527d8a880610c10a8d Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 17 Sep 2025 18:18:35 +0200 Subject: [PATCH 3/3] Upgrade to SnakeYAML 2.5, Protobuf 4.32.1, ActiveMQ 5.17.7 and Artemis 2.42, EasyMock 5.6, AssertJ 3.27.4, XMLUnit 2.10.4, Dom4J 2.2 --- framework-platform/framework-platform.gradle | 24 ++++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/framework-platform/framework-platform.gradle b/framework-platform/framework-platform.gradle index 5b42b34336e..d588007f996 100644 --- a/framework-platform/framework-platform.gradle +++ b/framework-platform/framework-platform.gradle @@ -15,7 +15,7 @@ dependencies { api(platform("io.rsocket:rsocket-bom:1.1.5")) api(platform("org.apache.groovy:groovy-bom:4.0.28")) api(platform("org.apache.logging.log4j:log4j-bom:2.21.1")) - api(platform("org.assertj:assertj-bom:3.27.3")) + api(platform("org.assertj:assertj-bom:3.27.4")) api(platform("org.eclipse.jetty:jetty-bom:12.0.26")) api(platform("org.eclipse.jetty.ee10:jetty-ee10-bom:12.0.26")) api(platform("org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.1")) @@ -31,7 +31,7 @@ dependencies { api("com.google.code.findbugs:findbugs:3.0.1") api("com.google.code.findbugs:jsr305:3.0.2") api("com.google.code.gson:gson:2.13.1") - api("com.google.protobuf:protobuf-java-util:4.32.0") + api("com.google.protobuf:protobuf-java-util:4.32.1") api("com.h2database:h2:2.3.232") api("com.jayway.jsonpath:json-path:2.9.0") api("com.oracle.database.jdbc:ojdbc11:21.9.0.0") @@ -90,11 +90,11 @@ dependencies { api("junit:junit:4.13.2") api("net.sf.jopt-simple:jopt-simple:5.0.4") api("org.apache-extras.beanshell:bsh:2.0b6") - api("org.apache.activemq:activemq-broker:5.17.6") - api("org.apache.activemq:activemq-kahadb-store:5.17.6") - api("org.apache.activemq:activemq-stomp:5.17.6") - api("org.apache.activemq:artemis-jakarta-client:2.31.2") - api("org.apache.activemq:artemis-junit-5:2.31.2") + api("org.apache.activemq:activemq-broker:5.17.7") + api("org.apache.activemq:activemq-kahadb-store:5.17.7") + api("org.apache.activemq:activemq-stomp:5.17.7") + api("org.apache.activemq:artemis-jakarta-client:2.42.0") + api("org.apache.activemq:artemis-junit-5:2.42.0") api("org.apache.commons:commons-pool2:2.9.0") api("org.apache.derby:derby:10.16.1.1") api("org.apache.derby:derbyclient:10.16.1.1") @@ -113,8 +113,8 @@ dependencies { api("org.bouncycastle:bcpkix-jdk18on:1.72") api("org.codehaus.jettison:jettison:1.5.4") api("org.crac:crac:1.4.0") - api("org.dom4j:dom4j:2.1.4") - api("org.easymock:easymock:5.5.0") + api("org.dom4j:dom4j:2.2.0") + api("org.easymock:easymock:5.6.0") api("org.eclipse.jetty:jetty-reactive-httpclient:4.0.11") api("org.eclipse.persistence:org.eclipse.persistence.jpa:3.0.4") api("org.eclipse:yasson:2.0.4") @@ -145,8 +145,8 @@ dependencies { api("org.webjars:underscorejs:1.8.3") api("org.webjars:webjars-locator-core:0.59") api("org.webjars:webjars-locator-lite:1.1.0") - api("org.xmlunit:xmlunit-assertj:2.10.3") - api("org.xmlunit:xmlunit-matchers:2.10.3") - api("org.yaml:snakeyaml:2.4") + api("org.xmlunit:xmlunit-assertj:2.10.4") + api("org.xmlunit:xmlunit-matchers:2.10.4") + api("org.yaml:snakeyaml:2.5") } }