From dcb7922a24f31be4fef9a791cb8d44199a29d566 Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Wed, 14 Jan 2026 11:32:59 +0000 Subject: [PATCH] Exclude DataAccessException and MessagingException in DisconnectedClientHelper Closes gh-36135 --- spring-web/spring-web.gradle | 2 ++ .../web/util/DisconnectedClientHelper.java | 16 +++++++++------- .../util/DisconnectedClientHelperTests.java | 18 +++++++++++------- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/spring-web/spring-web.gradle b/spring-web/spring-web.gradle index 2311b42aa94..8de090cbfe0 100644 --- a/spring-web/spring-web.gradle +++ b/spring-web/spring-web.gradle @@ -76,6 +76,8 @@ dependencies { testImplementation(testFixtures(project(":spring-beans"))) testImplementation(testFixtures(project(":spring-context"))) testImplementation(testFixtures(project(":spring-core"))) + testImplementation(testFixtures(project(":spring-messaging"))) + testImplementation(testFixtures(project(":spring-tx"))) testImplementation("com.fasterxml.jackson.datatype:jackson-datatype-jdk8") testImplementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310") testImplementation("com.fasterxml.jackson.module:jackson-module-kotlin") diff --git a/spring-web/src/main/java/org/springframework/web/util/DisconnectedClientHelper.java b/spring-web/src/main/java/org/springframework/web/util/DisconnectedClientHelper.java index b8e918f35cb..69dfbcc0026 100644 --- a/spring-web/src/main/java/org/springframework/web/util/DisconnectedClientHelper.java +++ b/spring-web/src/main/java/org/springframework/web/util/DisconnectedClientHelper.java @@ -16,7 +16,7 @@ package org.springframework.web.util; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.Locale; import java.util.Set; @@ -48,11 +48,13 @@ public class DisconnectedClientHelper { Set.of("AbortedException", "ClientAbortException", "EOFException", "EofException", "AsyncRequestNotUsableException"); - private static final Set> CLIENT_EXCEPTION_TYPES = new HashSet<>(2); + private static final Set> EXCLUDED_EXCEPTION_TYPES = new LinkedHashSet<>(4); static { - registerClientExceptionType("org.springframework.web.client.RestClientException"); - registerClientExceptionType("org.springframework.web.reactive.function.client.WebClientException"); + addExcludedExceptionType("org.springframework.web.client.RestClientException"); + addExcludedExceptionType("org.springframework.web.reactive.function.client.WebClientException"); + addExcludedExceptionType("org.springframework.dao.DataAccessException"); + addExcludedExceptionType("org.springframework.messaging.MessagingException"); } @@ -103,7 +105,7 @@ public class DisconnectedClientHelper { Throwable lastEx = null; while (currentEx != null && currentEx != lastEx) { // Ignore onward connection issues to other servers (500 error) - for (Class exceptionType : CLIENT_EXCEPTION_TYPES) { + for (Class exceptionType : EXCLUDED_EXCEPTION_TYPES) { if (exceptionType.isInstance(currentEx)) { return false; } @@ -128,10 +130,10 @@ public class DisconnectedClientHelper { return false; } - private static void registerClientExceptionType(String type) { + private static void addExcludedExceptionType(String type) { try { ClassLoader classLoader = DisconnectedClientHelper.class.getClassLoader(); - CLIENT_EXCEPTION_TYPES.add(ClassUtils.forName(type, classLoader)); + EXCLUDED_EXCEPTION_TYPES.add(ClassUtils.forName(type, classLoader)); } catch (ClassNotFoundException ex) { // ignore diff --git a/spring-web/src/test/java/org/springframework/web/util/DisconnectedClientHelperTests.java b/spring-web/src/test/java/org/springframework/web/util/DisconnectedClientHelperTests.java index f8deccc6e3a..fa4b2d18894 100644 --- a/spring-web/src/test/java/org/springframework/web/util/DisconnectedClientHelperTests.java +++ b/spring-web/src/test/java/org/springframework/web/util/DisconnectedClientHelperTests.java @@ -28,7 +28,9 @@ import org.junit.jupiter.params.provider.MethodSource; import org.junit.jupiter.params.provider.ValueSource; import reactor.netty.channel.AbortedException; +import org.springframework.dao.DataAccessResourceFailureException; import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.messaging.MessagingException; import org.springframework.web.client.ResourceAccessException; import org.springframework.web.context.request.async.AsyncRequestNotUsableException; import org.springframework.web.testfixture.http.MockHttpInputMessage; @@ -78,16 +80,18 @@ public class DisconnectedClientHelperTests { assertThat(DisconnectedClientHelper.isClientDisconnectedException(ex)).isTrue(); } - @Test // gh-34264 - void onwardClientDisconnectedExceptionPhrase() { - Exception ex = new ResourceAccessException("I/O error", new EOFException("Connection reset by peer")); + @ParameterizedTest // gh-34264 + @MethodSource("excludedExceptionsTypes") + void excludedExceptionTypes(Exception ex) { assertThat(DisconnectedClientHelper.isClientDisconnectedException(ex)).isFalse(); } - @Test - void onwardClientDisconnectedExceptionType() { - Exception ex = new ResourceAccessException("I/O error", new EOFException()); - assertThat(DisconnectedClientHelper.isClientDisconnectedException(ex)).isFalse(); + static List excludedExceptionsTypes() { + EOFException cause = new EOFException(); + return List.of( + new ResourceAccessException("", cause), + new DataAccessResourceFailureException("", new EOFException()), + new MessagingException("", cause)); } @Test // gh-34533