From 563919befd7aba60ffc5c7f3b8af401cef55d4c6 Mon Sep 17 00:00:00 2001 From: Sam Brannen <104798+sbrannen@users.noreply.github.com> Date: Wed, 1 Oct 2025 16:58:33 +0200 Subject: [PATCH] Revise nullability of Transaction[Callback|Operations|Operator] This commit revises the nullability declarations in TransactionCallback, TransactionOperations, and TransactionalOperator. Closes gh-35561 --- .../transaction/interceptor/TransactionAspectSupport.java | 2 +- .../transaction/reactive/TransactionCallback.java | 3 ++- .../transaction/reactive/TransactionalOperator.java | 7 ++++--- .../CallbackPreferringPlatformTransactionManager.java | 2 +- .../transaction/support/TransactionCallback.java | 4 ++-- .../support/TransactionCallbackWithoutResult.java | 2 +- .../transaction/support/TransactionOperations.java | 4 ++-- .../transaction/support/TransactionTemplate.java | 2 +- .../transaction/support/WithoutTransactionOperations.java | 2 +- 9 files changed, 15 insertions(+), 13 deletions(-) diff --git a/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java b/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java index 2441dc1069..823508689d 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java +++ b/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java @@ -412,7 +412,7 @@ public abstract class TransactionAspectSupport implements BeanFactoryAware, Init // It's a CallbackPreferringPlatformTransactionManager: pass a TransactionCallback in. try { - result = cpptm.execute(txAttr, status -> { + result = cpptm.<@Nullable Object> execute(txAttr, status -> { TransactionInfo txInfo = prepareTransactionInfo(ptm, txAttr, joinpointIdentification, status); try { Object retVal = invocation.proceedWithInvocation(); diff --git a/spring-tx/src/main/java/org/springframework/transaction/reactive/TransactionCallback.java b/spring-tx/src/main/java/org/springframework/transaction/reactive/TransactionCallback.java index 5c7cf027e4..37864524dc 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/reactive/TransactionCallback.java +++ b/spring-tx/src/main/java/org/springframework/transaction/reactive/TransactionCallback.java @@ -16,6 +16,7 @@ package org.springframework.transaction.reactive; +import org.jspecify.annotations.Nullable; import org.reactivestreams.Publisher; import org.springframework.transaction.ReactiveTransaction; @@ -36,7 +37,7 @@ import org.springframework.transaction.ReactiveTransaction; * @see TransactionalOperator */ @FunctionalInterface -public interface TransactionCallback { +public interface TransactionCallback { /** * Gets called by {@link TransactionalOperator} within a transactional context. diff --git a/spring-tx/src/main/java/org/springframework/transaction/reactive/TransactionalOperator.java b/spring-tx/src/main/java/org/springframework/transaction/reactive/TransactionalOperator.java index 97ebc74d8b..71ca2844ca 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/reactive/TransactionalOperator.java +++ b/spring-tx/src/main/java/org/springframework/transaction/reactive/TransactionalOperator.java @@ -16,6 +16,7 @@ package org.springframework.transaction.reactive; +import org.jspecify.annotations.Nullable; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -59,7 +60,7 @@ public interface TransactionalOperator { * @throws TransactionException in case of initialization, rollback, or system errors * @throws RuntimeException if thrown by the TransactionCallback */ - default Flux transactional(Flux flux) { + default Flux transactional(Flux flux) { return execute(it -> flux); } @@ -70,7 +71,7 @@ public interface TransactionalOperator { * @throws TransactionException in case of initialization, rollback, or system errors * @throws RuntimeException if thrown by the TransactionCallback */ - default Mono transactional(Mono mono) { + default Mono transactional(Mono mono) { return execute(it -> mono).singleOrEmpty(); } @@ -85,7 +86,7 @@ public interface TransactionalOperator { * @throws TransactionException in case of initialization, rollback, or system errors * @throws RuntimeException if thrown by the TransactionCallback */ - Flux execute(TransactionCallback action) throws TransactionException; + Flux execute(TransactionCallback action) throws TransactionException; // Static builder methods diff --git a/spring-tx/src/main/java/org/springframework/transaction/support/CallbackPreferringPlatformTransactionManager.java b/spring-tx/src/main/java/org/springframework/transaction/support/CallbackPreferringPlatformTransactionManager.java index ff0072da6d..5f17cabbe2 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/support/CallbackPreferringPlatformTransactionManager.java +++ b/spring-tx/src/main/java/org/springframework/transaction/support/CallbackPreferringPlatformTransactionManager.java @@ -55,7 +55,7 @@ public interface CallbackPreferringPlatformTransactionManager extends PlatformTr * @throws TransactionException in case of initialization, rollback, or system errors * @throws RuntimeException if thrown by the TransactionCallback */ - @Nullable T execute(@Nullable TransactionDefinition definition, TransactionCallback callback) + T execute(@Nullable TransactionDefinition definition, TransactionCallback callback) throws TransactionException; } diff --git a/spring-tx/src/main/java/org/springframework/transaction/support/TransactionCallback.java b/spring-tx/src/main/java/org/springframework/transaction/support/TransactionCallback.java index 9e78837424..616dc455bd 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/support/TransactionCallback.java +++ b/spring-tx/src/main/java/org/springframework/transaction/support/TransactionCallback.java @@ -36,7 +36,7 @@ import org.springframework.transaction.TransactionStatus; * @see CallbackPreferringPlatformTransactionManager */ @FunctionalInterface -public interface TransactionCallback { +public interface TransactionCallback { /** * Gets called by {@link TransactionTemplate#execute} within a transactional context. @@ -53,6 +53,6 @@ public interface TransactionCallback { * @see TransactionTemplate#execute * @see CallbackPreferringPlatformTransactionManager#execute */ - @Nullable T doInTransaction(TransactionStatus status); + T doInTransaction(TransactionStatus status); } diff --git a/spring-tx/src/main/java/org/springframework/transaction/support/TransactionCallbackWithoutResult.java b/spring-tx/src/main/java/org/springframework/transaction/support/TransactionCallbackWithoutResult.java index 109e299b47..0d04ebff73 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/support/TransactionCallbackWithoutResult.java +++ b/spring-tx/src/main/java/org/springframework/transaction/support/TransactionCallbackWithoutResult.java @@ -29,7 +29,7 @@ import org.springframework.transaction.TransactionStatus; * @since 28.03.2003 * @see TransactionTemplate */ -public abstract class TransactionCallbackWithoutResult implements TransactionCallback { +public abstract class TransactionCallbackWithoutResult implements TransactionCallback<@Nullable Object> { @Override public final @Nullable Object doInTransaction(TransactionStatus status) { diff --git a/spring-tx/src/main/java/org/springframework/transaction/support/TransactionOperations.java b/spring-tx/src/main/java/org/springframework/transaction/support/TransactionOperations.java index 3995ac3c3d..8cd134e761 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/support/TransactionOperations.java +++ b/spring-tx/src/main/java/org/springframework/transaction/support/TransactionOperations.java @@ -46,7 +46,7 @@ public interface TransactionOperations { * @throws RuntimeException if thrown by the TransactionCallback * @see #executeWithoutResult(Consumer) */ - @Nullable T execute(TransactionCallback action) throws TransactionException; + T execute(TransactionCallback action) throws TransactionException; /** * Execute the action specified by the given {@link Runnable} within a transaction. @@ -64,7 +64,7 @@ public interface TransactionOperations { * @see TransactionCallbackWithoutResult */ default void executeWithoutResult(Consumer action) throws TransactionException { - execute(status -> { + this.<@Nullable Object> execute(status -> { action.accept(status); return null; }); diff --git a/spring-tx/src/main/java/org/springframework/transaction/support/TransactionTemplate.java b/spring-tx/src/main/java/org/springframework/transaction/support/TransactionTemplate.java index 44f48390e5..475994bd31 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/support/TransactionTemplate.java +++ b/spring-tx/src/main/java/org/springframework/transaction/support/TransactionTemplate.java @@ -124,7 +124,7 @@ public class TransactionTemplate extends DefaultTransactionDefinition @Override - public @Nullable T execute(TransactionCallback action) throws TransactionException { + public T execute(TransactionCallback action) throws TransactionException { Assert.state(this.transactionManager != null, "No PlatformTransactionManager set"); if (this.transactionManager instanceof CallbackPreferringPlatformTransactionManager cpptm) { diff --git a/spring-tx/src/main/java/org/springframework/transaction/support/WithoutTransactionOperations.java b/spring-tx/src/main/java/org/springframework/transaction/support/WithoutTransactionOperations.java index ef3d352da9..c6397c9008 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/support/WithoutTransactionOperations.java +++ b/spring-tx/src/main/java/org/springframework/transaction/support/WithoutTransactionOperations.java @@ -41,7 +41,7 @@ final class WithoutTransactionOperations implements TransactionOperations { @Override - public @Nullable T execute(TransactionCallback action) throws TransactionException { + public T execute(TransactionCallback action) throws TransactionException { return action.doInTransaction(new SimpleTransactionStatus(false)); }