Приложение Spring-boot с ShedLock на Cassandra, получающее «NullPointerException: таблица не может быть нулевой»

Я пытаюсь интегрировать shedlock в свой весенний загрузочный проект, используя cassandra db.

Но я получаю следующую ошибку при запуске приложения.

2022-11-18 17:35:29,162 [main] ERRR o.s.boot.SpringApplication - Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'lockProvider'

Caused by: java.lang.NullPointerException: table can not be null
    at java.base/java.util.Objects.requireNonNull(Objects.java:233)
    at net.javacrumbs.shedlock.provider.cassandra.CassandraLockProvider$Configuration.<init>(CassandraLockProvider.java:69)
    at net.javacrumbs.shedlock.provider.cassandra.CassandraLockProvider$Configuration$Builder.build(CassandraLockProvider.java:157)

Файл application.yml

server:
  port: 8080
  data:
    cassandra:
      port: ${CASSANDRA_PORT:9042}
      username: ${CASSANDRA_USERNAME:cassandra}
      password: ${CASSANDRA_PASSWORD:cassandra}
      keyspace-name: ${CASSANDRA_KEYSPACE_NAME:my_keyspace}
      schema-action: recreate
      local-datacenter: ${CASSANDRA_LOCAL_DATACENTER:datacenter123}
      contact-points: ${CASSANDRA_HOST:localhost}

Класс конфигурации

import com.datastax.oss.driver.api.core.CqlSession;
import net.javacrumbs.shedlock.provider.cassandra.CassandraLockProvider;
import net.javacrumbs.shedlock.provider.cassandra.CassandraLockProvider.Configuration;
import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableScheduling;

@org.springframework.context.annotation.Configuration

@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "10m")

public class MyAppSchedulerConfiguration {

  @Bean
  public CassandraLockProvider lockProvider(CqlSession cqlSession) {
    return new CassandraLockProvider(Configuration.builder().withCqlSession(cqlSession).build());
  }
  
}

Файл pom.xml


<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.3.7.RELEASE</version>
  <relativePath/> <!-- lookup parent from repository -->
</parent>


<shedlock.version>4.42.0</shedlock.version>

<dependency>
  <groupId>net.javacrumbs.shedlock</groupId>
  <artifactId>shedlock-spring</artifactId>
  <version>${shedlock.version}</version>
</dependency>

<dependency>
  <groupId>net.javacrumbs.shedlock</groupId>
  <artifactId>shedlock-provider-cassandra</artifactId>
  <version>${shedlock.version}</version>
</dependency>

Скрипт Кассандры выполнен

CREATE KEYSPACE shedlock with replication = {'class':'SimpleStrategy', 'replication_factor':1} and durable_writes=true;
CREATE TABLE shedlock.lock (name text PRIMARY KEY, lockUntil timestamp, lockedAt timestamp, lockedBy text);

Я проверил через cqlsh, что таблица блокировки создана в cassandra.

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

Я пробовал конфигурации, указанные на странице официальной документации .

Я пробовал понижать версии Springboot и Shedlock, но бесполезно. **Спрингбут **смена версии 2.5.x (та же ошибка) 2.2.13.RELEASE (та же ошибка) 2.3.x (та же ошибка)

LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Как включить TLS в gRPC-клиенте и сервере : 2
Как включить TLS в gRPC-клиенте и сервере : 2
Здравствуйте! 🙏🏻 Надеюсь, у вас все хорошо и добро пожаловать в мой блог.
Сортировка hashmap по значениям
Сортировка hashmap по значениям
На Leetcode я решал задачу с хэшмапой и подумал, что мне нужно отсортировать хэшмапу по значениям.
0
0
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, вы должны указать имя таблицы следующим образом

  @Bean
  public CassandraLockProvider lockProvider(CqlSession cqlSession) {
    return new CassandraLockProvider(Configuration.builder().withCqlSession(cqlSession).withTableName("lock").build());
  }

Кажется, имя таблицы по умолчанию не задано при использовании построителя конфигурации.

Другие вопросы по теме