diff --git a/src/main/java/org/springframework/data/couchbase/core/ReactiveFindByIdOperationSupport.java b/src/main/java/org/springframework/data/couchbase/core/ReactiveFindByIdOperationSupport.java index 065a150c9..a5d127f9e 100644 --- a/src/main/java/org/springframework/data/couchbase/core/ReactiveFindByIdOperationSupport.java +++ b/src/main/java/org/springframework/data/couchbase/core/ReactiveFindByIdOperationSupport.java @@ -18,6 +18,9 @@ import static com.couchbase.client.java.kv.GetAndTouchOptions.getAndTouchOptions; import static com.couchbase.client.java.transactions.internal.ConverterUtil.makeCollectionIdentifier; +import com.couchbase.client.core.msg.kv.DurabilityLevel; +import com.couchbase.client.java.kv.PersistTo; +import com.couchbase.client.java.kv.ReplicateTo; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -107,6 +110,7 @@ public Mono one(final String id) { pArgs.getScope(), pArgs.getCollection(), null, null)); } } else { + rejectInvalidTransactionalOptions(); return ctxOpt.get().getCore().get(makeCollectionIdentifier(rc.async()), id) .flatMap(result -> support.decodeEntity(id, new String(result.contentAsBytes(), StandardCharsets.UTF_8), result.cas(), domainType, pArgs.getScope(), pArgs.getCollection(), @@ -129,6 +133,18 @@ public Mono one(final String id) { } + private void rejectInvalidTransactionalOptions() { + if (this.expiry != null) { + throw new IllegalArgumentException("withExpiry is not supported in a transaction"); + } + if (this.options != null) { + throw new IllegalArgumentException("withOptions is not supported in a transaction"); + } + if (this.fields != null) { + throw new IllegalArgumentException("project is not supported in a transaction"); + } + } + @Override public Flux all(final Collection ids) { return Flux.fromIterable(ids).flatMap(this::one); diff --git a/src/test/java/org/springframework/data/couchbase/transactions/CouchbaseTransactionalUnsettableParametersIntegrationTests.java b/src/test/java/org/springframework/data/couchbase/transactions/CouchbaseTransactionalUnsettableParametersIntegrationTests.java index 1ff2dd293..dd23e5213 100644 --- a/src/test/java/org/springframework/data/couchbase/transactions/CouchbaseTransactionalUnsettableParametersIntegrationTests.java +++ b/src/test/java/org/springframework/data/couchbase/transactions/CouchbaseTransactionalUnsettableParametersIntegrationTests.java @@ -23,7 +23,6 @@ import java.util.function.Consumer; import java.util.function.Function; -import com.couchbase.client.core.msg.kv.DurabilityLevel; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -43,6 +42,8 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.Transactional; +import com.couchbase.client.core.msg.kv.DurabilityLevel; +import com.couchbase.client.java.kv.GetOptions; import com.couchbase.client.java.kv.InsertOptions; import com.couchbase.client.java.kv.PersistTo; import com.couchbase.client.java.kv.RemoveOptions; @@ -177,6 +178,30 @@ public void removeWithOptions() { }); } + @DisplayName("Using findById().withExpiry in a transaction is rejected at runtime") + @Test + public void findWithExpiry() { + test((ops) -> { + ops.replaceById(Person.class).withExpiry(Duration.ofSeconds(3)).one(WalterWhite); + }); + } + + @DisplayName("Using findById().project in a transaction is rejected at runtime") + @Test + public void findProject() { + test((ops) -> { + ops.findById(Person.class).project(new String[] { "someField" }).one(WalterWhite.id()); + }); + } + + @DisplayName("Using findById().withOptions in a transaction is rejected at runtime") + @Test + public void findWithOptions() { + test((ops) -> { + ops.findById(Person.class).withOptions(GetOptions.getOptions()).one(WalterWhite.id()); + }); + } + @Service @Component @EnableTransactionManagement