Репозиторий Cassandra всегда использует пространство ключей из файла application.properties, а не из расширенного класса AbstractCassandraConfiguration - PullRequest
0 голосов
/ 28 мая 2018

У меня есть данные в разных пространствах ключей, у меня более одного пространства ключей в приложении с весенней загрузкой, поэтому я хочу, чтобы мои репозитории cassandra конфигурировались с разными пространствами ключей каждое, а не с одним пространством ключей на уровне приложения.В весеннем проекте, я смотрю что-то вроде пространства ключей должно быть настраиваемым на уровне репозитория.

Cassandra Repository всегда использует keyspace из файла application.properties, не работает, если ярасширить AbstractCassandraConfiguration класс и настроить пространство ключей и порт.Я создал Entity, CassandraConfig и Repository и попытался запросить и обновить Entity с помощью Respository.См. Мой код ниже.

pom.xml

<dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-cassandra</artifactId>
        <version>2.0.7.RELEASE</version>
</dependency>

Код объекта: -

import org.springframework.data.cassandra.core.mapping.PrimaryKey;
import org.springframework.data.cassandra.core.mapping.Table;

@Table
public class Company {
    @PrimaryKey
    private String companyid;
    private String companyName;
    private String address;
    public String getCompanyid() {
        return companyid;
    }
    public void setCompanyid(String companyid) {
        this.companyid = companyid;
    }
    public String getCompanyName() {
        return companyName;
    }
    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }

}

Код конфигурации Cassandra: -

import org.springframework.context.annotation.Configuration;
import org.springframework.data.cassandra.config.AbstractCassandraConfiguration;
import org.springframework.data.cassandra.repository.config.EnableCassandraRepositories;

@Configuration
@EnableCassandraRepositories(basePackageClasses=CompanyRepository.class)
public class CassandraConfig extends AbstractCassandraConfiguration {

    public String getContactPoints() {
        return "127.0.0.1";
      }
    @Override
    protected String getKeyspaceName() {
        return "CompanyDetails";
    }

}

Код репозитория: -

import java.util.List;

    import org.springframework.data.cassandra.repository.CassandraRepository;
    import org.springframework.data.cassandra.repository.Query;
    import org.springframework.stereotype.Repository;

@Repository

    public interface CompanyRepository extends CassandraRepository<Company, String> {
                    @Query(allowFiltering=true)
                    public Company findByCompanyName(String companyname);

                    public List<Company> findAll();
    }

Я попытался установить пространство ключей для репозитория, используя класс, который расширяет AbstractCassandraConfiguration вместо application.properties.это не сработало cassandraTemplate работает нормально.Я получаю проблемы только с хранилищем.даже если я создаю и настраиваю CassandraClusterFactoryBean, CassandraMappingContext, CassandraConverter и CassandraSessionFactoryBean, бобовый репозиторий выбрасывает ниже исключения

com.datastax.driver.core.exceptions.InvalidQueryException: No keyspace has been specified. USE a keyspace, or explicitly specify keyspace.tablename
    at com.datastax.driver.core.Responses$Error.asException(Responses.java:147) ~[cassandra-driver-core-3.4.0.jar:na]
    at com.datastax.driver.core.DefaultResultSetFuture.onSet(DefaultResultSetFuture.java:179) ~[cassandra-driver-core-3.4.0.jar:na]

, если я добавляю ниже записей в файл application.properties, тогда он работает нормально.

возможно ли установить пространство ключей для репозитория через класс, который расширяет класс AbstractCassandraConfiguration вместо application.properties?

Не стесняйтесь указывать, если я пропустил или сделал что-то не так.

1 Ответ

0 голосов
/ 03 августа 2018

Похоже, вы забыли создать пространство ключей.С getKeySpaceName() вы сообщаете Cassandra, какое пространство клавиш вы хотите использовать, но если его нет, вы получите ошибку.Для создания пространства ключей используйте следующий метод:

@Override
protected List<CreateKeyspaceSpecification> getKeyspaceCreations() {
    return Arrays.asList(
            CreateKeyspaceSpecification.createKeyspace()
                    .name("your_keyspace_name")
                    .ifNotExists()
    );
}
...