Spring Data Cassandra问题:已配置Keyspace仍报未指定错误求助
我看了你遇到的问题,明明在CassandraConfig里指定了Keyspace,但执行查询时还是提示没有指定Keyspace。咱们来一步步拆解原因和解决办法:
首先看你贴的错误信息:
com.datastax.driver.core.exceptions.InvalidQueryException: No keyspace has been specified. USE a keyspace, or explicitly specify keyspace.tablename
at com.datastax.driver.core.Responses$Error.asException(Responses.java:147) ~[cassandra-driver-core-3.4.0.jar:na]
CQL [SELECT * FROM test WHERE token='asdasdasdasd';]; No keyspace has been specified. USE a keyspace, or explicitly specify keyspace.tablename;
再看你的配置代码,问题出在你自定义的cluster()Bean上。当你继承AbstractCassandraConfiguration时,这个父类已经帮你封装了CassandraClusterFactoryBean的创建逻辑,并且会自动把你重写的getKeyspaceName()配置关联到Cluster实例中。但你自己重新定义了cluster()Bean,直接覆盖了父类的默认实现,导致Keyspace的配置没有被正确应用,所以执行CQL时系统找不到对应的Keyspace。
修复方案
移除自定义的cluster()Bean,通过重写父类的方法来配置ContactPoints和Port:
修改后的CassandraConfig代码:
@Configuration @EnableCassandraRepositories(basePackages = "com.test.model") public class CassandraConfig extends AbstractCassandraConfiguration { @Override protected String getKeyspaceName() { return "testKeySpace"; } // 重写父类方法指定Cassandra连接地址 @Override protected String getContactPoints() { return "127.0.0.1"; } // 重写父类方法指定Cassandra端口 @Override protected int getPort() { return 9142; } @Bean public CassandraMappingContext cassandraMapping() throws ClassNotFoundException { return new BasicCassandraMappingContext(); } }
另外,还要确保你的实体类正确关联了Keyspace和表名,比如:
import org.springframework.data.cassandra.core.mapping.PrimaryKey; import org.springframework.data.cassandra.core.mapping.Table; @Table(keyspace = "testKeySpace", name = "test") public class TestEntity { @PrimaryKey private String token; // 其他字段、构造方法、getter/setter }
这样修改之后,Spring Data Cassandra会正确加载你指定的Keyspace配置,执行查询时就不会再出现“No keyspace has been specified”的错误了。
内容的提问来源于stack exchange,提问作者M. Alexandru

