![](/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.