Spring Boot集成ShedLock(Cassandra)启动报错:table can not be null
问题分析与解决方案
错误根源
启动时的NullPointerException: table can not be null是因为ShedLock的Cassandra锁提供者配置中未显式指定锁表名称,同时你的application.yml存在配置缩进错误,导致Cassandra连接配置未被Spring Boot正确加载。
具体修复步骤
1. 修正application.yml的Cassandra配置缩进
你当前将Cassandra配置放在了server节点下,这是错误的,Spring Boot的Cassandra配置应归属spring节点。修改后如下:
server: port: 8080 spring: data: cassandra: port: ${CASSANDRA_PORT:9042} username: ${CASSANDRA_USERNAME:cassandra} password: ${CASSANDRA_PASSWORD:cassandra} keyspace-name: ${CASSANDRA_KEYSPACE_NAME:shedlock} # 改为锁表所在的shedlock keyspace schema-action: recreate local-datacenter: ${CASSANDRA_LOCAL_DATACENTER:datacenter123} contact-points: ${CASSANDRA_HOST:localhost}
2. 显式配置ShedLock的Cassandra锁表信息
在你的MyAppSchedulerConfiguration类中,创建CassandraLockProvider时必须指定锁表的keyspace和表名(或完整表路径):
@Bean public CassandraLockProvider lockProvider(CqlSession cqlSession) { return new CassandraLockProvider(Configuration.builder() .withCqlSession(cqlSession) .withKeyspace("shedlock") // 锁表所在的keyspace .withTable("lock") // 锁表名称 .build()); }
如果已经在application.yml中将keyspace-name设为shedlock,也可以简化为直接指定表名:
@Bean public CassandraLockProvider lockProvider(CqlSession cqlSession) { return new CassandraLockProvider(Configuration.builder() .withCqlSession(cqlSession) .withTable("lock") .build()); }
额外验证
启动前可以通过cqlsh再次确认:
shedlockkeyspace存在shedlock.lock表结构正确(字段name为主键,lockUntil、lockedAt、lockedBy字段存在)
内容的提问来源于stack exchange,提问作者NeverStopLearning
相关产品推荐
相关产品推荐

