2017-01-31 18 views
2

私はカスタムリポジトリを使ってTTL(Time to Live)値のエンティティを保存しようとしています。私は多くの検索とオンラインのドキュメントを読んだことがありますが、まだ例外が発生しています。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) 

答えて

0

あなたは他のと(サービスクラス内部のスプリングブートアプリケーションでは、このようなものを使用することができます'normal' cassandra repo)、TTLは秒単位で表示されます。あなたは完全なTTL-repo implを求めていますこれは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); 
} 
関連する問題