Browse Source

Invert order of suppressed exceptions (for common exception rendering)

See gh-35057
pull/35129/head
Juergen Hoeller 6 months ago
parent
commit
e828bbbb0a
  1. 5
      spring-core/src/main/java/org/springframework/core/retry/RetryTemplate.java
  2. 4
      spring-core/src/test/java/org/springframework/core/retry/RetryTemplateTests.java

5
spring-core/src/main/java/org/springframework/core/retry/RetryTemplate.java

@ -19,7 +19,6 @@ package org.springframework.core.retry;
import java.time.Duration; import java.time.Duration;
import java.util.ArrayDeque; import java.util.ArrayDeque;
import java.util.Deque; import java.util.Deque;
import java.util.Iterator;
import org.jspecify.annotations.Nullable; import org.jspecify.annotations.Nullable;
@ -203,9 +202,7 @@ public class RetryTemplate implements RetryOperations {
RetryException finalException = new RetryException( RetryException finalException = new RetryException(
"Retry policy for operation '%s' exhausted; aborting execution".formatted(retryableName), "Retry policy for operation '%s' exhausted; aborting execution".formatted(retryableName),
exceptions.removeLast()); exceptions.removeLast());
for (Iterator<Throwable> it = exceptions.descendingIterator(); it.hasNext();) { exceptions.forEach(finalException::addSuppressed);
finalException.addSuppressed(it.next());
}
this.retryListener.onRetryPolicyExhaustion(retryExecution, finalException); this.retryListener.onRetryPolicyExhaustion(retryExecution, finalException);
throw finalException; throw finalException;
} }

4
spring-core/src/test/java/org/springframework/core/retry/RetryTemplateTests.java

@ -178,8 +178,8 @@ class RetryTemplateTests {
.withMessage("Retry policy for operation 'test' exhausted; aborting execution") .withMessage("Retry policy for operation 'test' exhausted; aborting execution")
.withCauseExactlyInstanceOf(IllegalStateException.class) .withCauseExactlyInstanceOf(IllegalStateException.class)
.satisfies(hasSuppressedExceptionsSatisfyingExactly( .satisfies(hasSuppressedExceptionsSatisfyingExactly(
suppressed1 -> assertThat(suppressed1).isExactlyInstanceOf(IOException.class), suppressed1 -> assertThat(suppressed1).isExactlyInstanceOf(FileNotFoundException.class),
suppressed2 -> assertThat(suppressed2).isExactlyInstanceOf(FileNotFoundException.class) suppressed2 -> assertThat(suppressed2).isExactlyInstanceOf(IOException.class)
)); ));
// 3 = 1 initial invocation + 2 retry attempts // 3 = 1 initial invocation + 2 retry attempts
assertThat(invocationCount).hasValue(3); assertThat(invocationCount).hasValue(3);

Loading…
Cancel
Save