用于TTL保存的Spring Cassandra自定义存储库

时间:2017-01-31 18:23:16

标签: spring cassandra

我正在尝试使用自定义存储库来保存具有TTL(生存时间)值的实体。我已经做了很多搜索和在线阅读文档,但我仍然有例外。

感谢任何帮助。

Caused by: org.springframework.data.mapping.PropertyReferenceException: No property saveWithTTL found for type Task!

摘录如下:

任务(实体):

@Table
public class Task {
    @PrimaryKeyColumn(ordinal = 0, type = PrimaryKeyType.PARTITIONED)
    private String uuid;

    private Type type;
    private Status status;
    private String parentId;

    private String body;

}

CassandraDbConfig:

@Configuration
@PropertySource(value = "classpath:cassandra.properties")
@EnableCassandraRepositories(repositoryBaseClass = TTLRepositoryCustomImpl.class)
public class CassandraDbConfig extends DefaultCassandraConfig {

}

TTLRepositoryCustom:

@NoRepositoryBean
public interface TTLRepositoryCustom<T> extends CassandraRepository<T> {

    T saveWithTTL(T entity, Integer ttl);
}

TTLRepositoryCustomImpl:

public class TTLRepositoryCustomImpl<T> extends SimpleCassandraRepository<T, MapId>implements TTLRepositoryCustom<T> {

    public TTLRepositoryCustomImpl(final CassandraEntityInformation<T, MapId> metadata,
            final CassandraOperations operations) {
        super(metadata, operations);
    }

    @Override
    public T saveWithTTL(T entity, Integer ttl) {
        WriteOptions options = new WriteOptions();
        options.setTtl(ttl);
        return operations.insert(entity, options);
    }
}

TaskDbRepository:

@Repository
public interface TaskDbRepository extends TTLRepositoryCustom<Task> {

}

完整堆栈跟踪:

Caused by: org.springframework.data.mapping.PropertyReferenceException: No property saveWithTTL found for type Task!
    at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:77)
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:329)
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:309)
    at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:272)
    at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:243)
    at org.springframework.data.repository.query.parser.Part.<init>(Part.java:76)
    at org.springframework.data.repository.query.parser.PartTree$OrPart.<init>(PartTree.java:247)
    at org.springframework.data.repository.query.parser.PartTree$Predicate.buildTree(PartTree.java:398)
    at org.springframework.data.repository.query.parser.PartTree$Predicate.<init>(PartTree.java:378)
    at org.springframework.data.repository.query.parser.PartTree.<init>(PartTree.java:86)
    at org.springframework.data.cassandra.repository.query.PartTreeCassandraQuery.<init>(PartTreeCassandraQuery.java:47)
    at org.springframework.data.cassandra.repository.support.CassandraRepositoryFactory$CassandraQueryLookupStrategy.resolveQuery(CassandraRepositoryFactory.java:163)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:436)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:221)

1 个答案:

答案 0 :(得分:0)

您可以在服务类中的spring boot应用程序中使用类似的东西(在应用程序中使用其他'普通'cassandra repo),TTL将在几秒钟内完成,我知道您要求完整的TTL-repo实现,但如果您只想用TTL保存它,这可能很方便。

@Autowired
private CassandraOperations cassandraOperations;

private void saveWithTTL(Task task)
{
    String cql = "insert into task (uuid, body) values ('"+task.getUuid()+"', "+task.getBody()+") USING TTL 86400;";
    cassandraOperations.execute(cql);
}