Проблема с Spring data cassandra из-за обновления версии загрузки Spring до 2.3.1 - PullRequest
0 голосов
/ 19 июня 2020

Из-за улучшений, внесенных в поддержку образов docker в выпуске Spring загрузки 2.3, мы решили перейти на эту версию. В нашем проекте мы используем Cassandra в качестве одной из баз данных. Но похоже, что в Spring data cassandra многое изменилось, помимо перехода на версию драйвера cassandra 4. Проблема в том, что это исключение не позволяет запускать приложение,

 java.lang.IllegalStateException: Since you provided explicit contact points, the local DC must be explicitly set (see basic.load-balancing-policy.local-datacenter in the config, or set it programmatically with SessionBuilder.withLocalDatacenter)

Теперь я поискал в сети и нашли людей, предлагающих:

Добавить это свойство в мое application.properties:

spring.data.cassandra.local-datacenter=datacenter1 (in my case since in the exception that it throws, it's mentioned that the local datacenter is - datacenter1)

и указать его, используя при создании bean-компонента CqlSession, что я и делаю:

public CqlSession session() {

     String containerIpAddress = getContactPoints();
     int containerPort = getPort();
     InetSocketAddress containerEndPoint = new InetSocketAddress(containerIpAddress, containerPort);

    return CqlSession.builder().withLocalDatacenter(getLocalDataCenter())
            .addContactPoint(containerEndPoint)
            .withAuthCredentials(dbProperties.getCassandraUserName(), dbProperties.getCassandraPassword())
            .withKeyspace(getKeyspaceName()).build(); }

Но я все еще завис и не могу запустить приложение. Как можно решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 20 августа 2020

У меня сработало, используя эту конфигурацию

public CqlSession session() {
        return CqlSession.builder().withLocalDatacenter(getLocalDataCenter())
                .addContactPoint(InetSocketAddress.createUnresolved(getContactPoints(), 9042))
                //.withAuthCredentials(dbProperties.getCassandraUserName(), dbProperties.getCassandraPassword())
                .withKeyspace(getKeyspaceName()).build();
    }


@Bean
    @ConditionalOnMissingBean
    public CassandraTemplate cassandraTemplate(CqlSession session) throws Exception {
        return new CassandraTemplate(session);
    }
0 голосов
/ 20 июля 2020

Я использую Reactive Cassandra, но в основном это то же самое. Новое поле центра обработки данных можно найти, войдя в свой экземпляр cassandra и запустив

select data_center from system.local;

Что касается моей конфигурации, это выглядит так:

@Configuration
@EnableReactiveCassandraRepositories
public class CassandraConfig {

  @Value("${spring.data.cassandra.contact-points}")
  private String hostList;

  @Value("${spring.data.cassandra.datacenter}")
  private String datacenter;

  @Value("${spring.data.cassandra.keyspace-name}")
  private String keyspaceName;

  @Value("${spring.data.cassandra.username}")
  private String userName;

  @Value("${spring.data.cassandra.password}")
  private String password;

  @Value("${spring.data.cassandra.port}")
  private Integer port;

  @Bean
  public CqlSessionFactoryBean getCqlSession() {
    CqlSessionFactoryBean factory = new CqlSessionFactoryBean();
    factory.setUsername(userName);
    factory.setPassword(password);
    factory.setPort(port);
    factory.setKeyspaceName(keyspaceName);
    factory.setContactPoints(hostList);
    factory.setLocalDatacenter(datacenter);
    return factory;
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...