diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/WriteOptions.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/WriteOptions.java index 1325d1276..ad4a9e940 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/WriteOptions.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/cql/WriteOptions.java @@ -143,6 +143,7 @@ public class WriteOptions extends QueryOptions { * * @author Mark Paluch * @author Lukasz Antoniak + * @author Thomas Strauß * @since 1.5 */ public static class WriteOptionsBuilder extends QueryOptionsBuilder { @@ -291,7 +292,7 @@ public class WriteOptions extends QueryOptions { public WriteOptionsBuilder ttl(Duration ttl) { Assert.notNull(ttl, "TTL must not be null"); - Assert.isTrue(!ttl.isNegative(), "TTL must be greater than equal to zero"); + Assert.isTrue(!ttl.isNegative() && !ttl.isZero(), "TTL must be greater than equal to zero"); this.ttl = ttl; diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/WriteOptionsUnitTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/WriteOptionsUnitTests.java index 87baa031c..d9de9701e 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/WriteOptionsUnitTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/cql/WriteOptionsUnitTests.java @@ -22,6 +22,7 @@ import java.time.Duration; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneOffset; +import java.time.temporal.ChronoUnit; import org.junit.jupiter.api.Test; @@ -33,6 +34,7 @@ import com.datastax.oss.driver.api.core.DefaultConsistencyLevel; * * @author Mark Paluch * @author Sam Lightfoot + * @author Thomas Strauß */ class WriteOptionsUnitTests { @@ -106,4 +108,32 @@ class WriteOptionsUnitTests { CqlIdentifier.fromCql("routing_keyspace")); assertThat(writeOptions.getRoutingKey()).isEqualTo(ByteBuffer.allocate(1)); } + + @Test // GH-1248 + void buildWriteOptionsWithTtlDurationZero() { + try { + WriteOptions writeOptions = WriteOptions.builder() + .ttl(Duration.ZERO) + .build(); + + fail("WiteOptionsBuilder must not allow zero TTL"); + } + catch (Exception e) { + // expected behavior + } + } + + @Test // GH-1248 + void buildWriteOptionsWithTtlNegativeDuration() { + try { + WriteOptions writeOptions = WriteOptions.builder() + .ttl(Duration.of(-1, ChronoUnit.MICROS)) + .build(); + + fail("WiteOptionsBuilder must not allow negative TTL"); + } + catch (Exception e) { + // expected behavior + } + } }