![](/img/trans.png)
[英]spring-boot and shedlock - how to track down dependency conflicts?
[英]Spring-boot app with ShedLock on Cassandra, getting "NullPointerException: table can not be null"
我正在嘗試使用 cassandra 數據庫將 shedlock 集成到我的 spring 引導項目中。
但是我在應用程序啟動時收到以下錯誤。
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}
配置 class
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>
Cassandra 腳本執行
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 bean 由於某種原因不可用,應該是。
我已經嘗試了官方文檔頁面中提到的配置。
我曾嘗試降級 springboot 和 shedlock 的版本,但沒有用。 **Springboot **版本變更 2.5.x(同樣的錯誤) 2.2.13.RELEASE(同樣的錯誤) 2.3.x(同樣的錯誤)
我認為你必須像這樣指定 tableName
@Bean
public CassandraLockProvider lockProvider(CqlSession cqlSession) {
return new CassandraLockProvider(Configuration.builder().withCqlSession(cqlSession).withTableName("lock").build());
}
使用配置生成器時似乎未設置默認表名。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.