You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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再次确认:

  • shedlock keyspace存在
  • shedlock.lock表结构正确(字段name为主键,lockUntil、lockedAt、lockedBy字段存在)

内容的提问来源于stack exchange,提问作者NeverStopLearning

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 02:35:32