Поддержка TTL в приложении Spring Boot с использованием Spring-Data-Cassandra

Я пытаюсь добавить TTL к каждому столбцу при вставке и обновлении данных с помощью приложения для весенней загрузки. Для этого я использую spring-data-cassandra 1.1.3.RELEASE

Для этого я написал один интерфейс CustomTTLRepository:

@NoRepositoryBean

public interface CustomTTLRepository<T, ID extends Serializable> extends TypedIdCassandraRepository<T, ID> {

    <S extends T> S save(S s, int ttl);

}

Реализация CustomTTLRepositoryImpl:

@NoRepositoryBean

public class CustomTTLRepositoryImpl<T, ID extends Serializable> extends SimpleCassandraRepository<T, ID> implements CustomTTLRepository<T, ID> {

    public CustomTTLRepositoryImpl(CassandraEntityInformation<T, ID> metadata, CassandraTemplate template) {
         super(metadata, template);
         this.entityInformation = metadata;
         this.template = template;
    }   

    @Override
    public <S extends T> S save(S s, int ttl) {
        WriteOptions writeOptions=new WriteOptions();
        writeOptions.setTtl(ttl);
        return template.insert(s, writeOptions);
    }

}

Но когда я пытаюсь развернуть это приложение, я получаю следующую ошибку:

Caused by: java.lang.IllegalArgumentException: encountered unsupported query parameter type [class java.lang.Object] in method public abstract java.lang.Object com.cisco.operation.CustomTTLRepository.save(java.lang.Object,int)
    at org.springframework.data.cassandra.repository.query.CassandraQueryMethod.verify(CassandraQueryMethod.java:104)
    at org.springframework.data.cassandra.repository.query.CassandraQueryMethod.<init>(CassandraQueryMethod.java:68)
    at org.springframework.data.cassandra.repository.support.CassandraRepositoryFactory$CassandraQueryLookupStrategy.resolveQuery(CassandraRepositoryFactory.java:106)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:369)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:192)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn(RepositoryFactoryBeanSupport.java:239)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:225)

person Kiran Singh    schedule 29.12.2015    source источник
comment
Вы реализовали свой RepositoryFactoryBeanSupport?   -  person jny    schedule 06.01.2016
comment
ты решил эту проблему?   -  person Hasson    schedule 18.01.2017
comment
аналогичный вопрос здесь stackoverflow.com/questions/34505376/, если это не сработает, вы можете определить ttl по умолчанию на уровне таблицы, чтобы вам не приходилось делать это здесь в коде. Я знаю, что иногда вам нужны разные ttls, но если это не так, проще всего просто положить их на стол.   -  person Marko Švaljek    schedule 31.01.2017


Ответы (2)


Это может быть старая ветка для отправки любого сообщения. Но это помогло мне выполнить мою задачу. Итак, вот решения, которые сработали для меня

  1. Настройка базового репозитория
  2. Настройка индивидуального репозитория

Изменения в настройке базового репозитория

1.1. Расширьте CassandraRepository, чтобы добавить метод сохранения, который принимает TTL

@NoRepositoryBean
public interface ExtendedCassandraRepository<T, ID> extends CassandraRepository<T, ID> {
    <S extends T> S save(S entity, int ttl);
}

1.2. Обеспечить реализацию для нового метода сохранения

public class ExtendedCassandraRepositoryImpl<T, ID> extends SimpleCassandraRepository<T, ID> implements ExtendedCassandraRepository<T, ID> {

private final CassandraEntityInformation<T, ID> entityInformation;
private final CassandraOperations operations;

public ExtendedCassandraRepositoryImpl(CassandraEntityInformation metadata, CassandraOperations operations) {
    super(metadata, operations);

    this.entityInformation = metadata;
    this.operations = operations;
}

@Override
public <S extends T> S save(S entity, int ttl) {
    InsertOptions insertOptions = org.springframework.data.cassandra.core.InsertOptions.builder().ttl(ttl).build();
    operations.insert(entity, insertOptions);
    return entity;
}
}

1.3. Создать репозиторий для моей доменной сущности

@Repository
public interface MyDomainEntityRepository extends ExtendedCassandraRepository<MyDomainEntity,String> {
}

1.4. Обновить repositoryBaseClass

@EnableCassandraRepositories(basePackages = "my.repository", repositoryBaseClass = ExtendedCassandraRepositoryImpl.class)

Изменения в настройке индивидуального репозитория

2.1. Определите интерфейс фрагмента с новым методом сохранения

public interface CustomizedSave<T> {
    <S extends T> S save(S entity, int ttl);
}

2.2. Обеспечить реализацию

public class CustomizedSaveImpl<T> implements CustomizedSave<T> {

@Autowired
private CassandraOperations operations;

@Override
public <S extends T> S save(S entity, int ttl) {
    InsertOptions insertOptions = org.springframework.data.cassandra.core.InsertOptions.builder().ttl(ttl).build();
    operations.insert(entity, insertOptions);
    return entity;
}
}

2.3. Расширить этот метод в репозитории

@Repository
public interface MyDomainEntityRepository extends CassandraRepository<MyDomainEntity,String>, CustomizedSave<MyDomainEntity> {
}

Справочный документ https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.custom-implementations.

person A Sarkar    schedule 24.12.2018


Несмотря на то, что это слишком поздно, ответ может оказаться полезным для других, я пробовал с CassandraOperations, который работает нормально, пожалуйста, проверьте реализацию репозитория ниже

 @Repository
 public class DomainRepository {

 @Autowired
 CassandraOperations cassandraOperations;

 @Autowired
 WriteOptions writeOptions;

 @Override
 public void save(DomainObject domainObject) {
    writeOptions.setTtl(100);
    cassandraOperations.insert(domainObject,writeOptions);
 }
}

Спасибо

person prasad    schedule 31.05.2017