Reputation: 715
I am new to Cassandra and was trying to set up a springboot project(version 2.4.0) conencting to cassandra(spring cassandra 3.1.1) using docker. Below is my code:
Config class:
@Configuration
@EnableCassandraRepositories
public class ClusterConfig extends AbstractCassandraConfiguration {
private final String keyspace;
private final String hosts;
private final String datacenter;
ClusterConfig(
@Value("${spring.data.cassandra.keyspace-name}") String keyspace,
@Value("${spring.data.cassandra.contact-points}") String hosts,
@Value("${spring.data.cassandra.local-datacenter}") String datacenter){
this.keyspace = keyspace;
this.hosts = hosts;
this.datacenter = datacenter;
}
@Bean
@Primary
public CassandraCqlSessionFactoryBean cluster() {
RetryingCassandraClusterFactoryBean bean = new RetryingCassandraClusterFactoryBean();
bean.setContactPoints(getContactPoints());
bean.setPort(getPort());
bean.setKeyspaceCreations(getKeyspaceCreations());
bean.setKeyspaceDrops(getKeyspaceDrops());
bean.setLocalDatacenter(getLocalDataCenter());
return bean;
}
@Override
protected List<CreateKeyspaceSpecification> getKeyspaceCreations() {
final CreateKeyspaceSpecification specification =
CreateKeyspaceSpecification.createKeyspace(keyspace)
.ifNotExists()
.with(KeyspaceOption.DURABLE_WRITES, true)
.withSimpleReplication();
List specList = new ArrayList();
specList.add(specification);
return specList;
}
@Override
protected String getKeyspaceName() {
return keyspace;
}
@Override
protected String getContactPoints() {
return hosts;
}
@Override
protected String getLocalDataCenter(){
return datacenter;
}
@Override
public String[] getEntityBasePackages() {
return new String[]{"com.example.cassandra.springbootcassandrademo.model"};
}
}
Repository:
public interface ProductRepository extends CassandraRepository<Product, Integer> {
}
Table:
@Table("product")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Product {
@PrimaryKey
private int id;
private String name;
}
application.yml
spring:
data:
cassandra:
port: 9042
local-datacenter: datacenter1
contact-points: cassandradb
keyspace-name: mykeyspace
schema-action: CREATE_IF_NOT_EXISTS
entity-base-package: com.example.cassandra.springbootcassandrademo.model
docker-compose.yml file
version: "2"
services:
spring_boot_app:
build: .
ports:
- "8080:8080"
cassandradb:
image: cassandra
container_name: cassandradb
ports:
- "9042:9042"
When both the spring app and the cassandra containers start, I create the below table in the keyspace "mykeyspace"
use mykeyspace;
CREATE TABLE Product(id int PRIMARY KEY, name TEXT);
When I hit the rest endpoint (get) through my controller, I get the error:
com.datastax.oss.driver.api.core.servererrors.InvalidQueryException: unconfigured table product
I checked this post where the accepted answer says to create the table in the defined keyspace(which I am already doing): com.datastax.driver.core.exceptions.InvalidQueryException: unconfigured table user"
Can someone please help me?
Thanks!
Full stack trace:
cassandradb | INFO [MigrationStage:1] 2020-11-27 18:05:44,101 ColumnFamilyStore.java:427 - Initializing mykeyspace.product
spring_boot_app_1 | 2020-11-27 18:05:56.428 INFO 1 --- [nio-8080-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
spring_boot_app_1 | 2020-11-27 18:05:56.428 INFO 1 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
spring_boot_app_1 | 2020-11-27 18:05:56.430 INFO 1 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms
spring_boot_app_1 | ############## inside get products
spring_boot_app_1 | 2020-11-27 18:05:56.552 ERROR 1 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.data.cassandra.CassandraInvalidQueryException: Query; CQL [com.datastax.oss.driver.internal.core.cql.DefaultSimpleStatement@11bd51f5]; unconfigured table product; nested exception is com.datastax.oss.driver.api.core.servererrors.InvalidQueryException: unconfigured table product] with root cause
spring_boot_app_1 |
spring_boot_app_1 | com.datastax.oss.driver.api.core.servererrors.InvalidQueryException: unconfigured table product
spring_boot_app_1 | at com.datastax.oss.driver.api.core.servererrors.InvalidQueryException.copy(InvalidQueryException.java:48) ~[java-driver-core-4.9.0.jar!/:na]
spring_boot_app_1 | at com.datastax.oss.driver.internal.core.util.concurrent.CompletableFutures.getUninterruptibly(CompletableFutures.java:149) ~[java-driver-core-4.9.0.jar!/:na]
spring_boot_app_1 | at com.datastax.oss.driver.internal.core.cql.CqlRequestSyncProcessor.process(CqlRequestSyncProcessor.java:53) ~[java-driver-core-4.9.0.jar!/:na]
spring_boot_app_1 | at com.datastax.oss.driver.internal.core.cql.CqlRequestSyncProcessor.process(CqlRequestSyncProcessor.java:30) ~[java-driver-core-4.9.0.jar!/:na]
spring_boot_app_1 | at com.datastax.oss.driver.internal.core.session.DefaultSession.execute(DefaultSession.java:230) ~[java-driver-core-4.9.0.jar!/:na]
spring_boot_app_1 | at com.datastax.oss.driver.api.core.cql.SyncCqlSession.execute(SyncCqlSession.java:54) ~[java-driver-core-4.9.0.jar!/:na]
spring_boot_app_1 | at org.springframework.data.cassandra.core.cql.CqlTemplate.query(CqlTemplate.java:298) ~[spring-data-cassandra-3.1.1.jar!/:3.1.1]
spring_boot_app_1 | at org.springframework.data.cassandra.core.cql.CqlTemplate.query(CqlTemplate.java:320) ~[spring-data-cassandra-3.1.1.jar!/:3.1.1]
spring_boot_app_1 | at org.springframework.data.cassandra.core.CassandraTemplate.doSelect(CassandraTemplate.java:408) ~[spring-data-cassandra-3.1.1.jar!/:3.1.1]
spring_boot_app_1 | at org.springframework.data.cassandra.core.CassandraTemplate.select(CassandraTemplate.java:393) ~[spring-data-cassandra-3.1.1.jar!/:3.1.1]
spring_boot_app_1 | at org.springframework.data.cassandra.repository.support.SimpleCassandraRepository.findAll(SimpleCassandraRepository.java:180) ~[spring-data-cassandra-3.1.1.jar!/:3.1.1]
spring_boot_app_1 | at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
spring_boot_app_1 | at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
spring_boot_app_1 | at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
spring_boot_app_1 | at java.base/java.lang.reflect.Method.invoke(Method.java:567) ~[na:na]
spring_boot_app_1 | at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:289) ~[spring-data-commons-2.4.1.jar!/:2.4.1]
spring_boot_app_1 | at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137) ~[spring-data-commons-2.4.1.jar!/:2.4.1]
spring_boot_app_1 | at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121) ~[spring-data-commons-2.4.1.jar!/:2.4.1]
spring_boot_app_1 | at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:524) ~[spring-data-commons-2.4.1.jar!/:2.4.1]
spring_boot_app_1 | at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285) ~[spring-data-commons-2.4.1.jar!/:2.4.1]
spring_boot_app_1 | at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:531) ~[spring-data-commons-2.4.1.jar!/:2.4.1]
spring_boot_app_1 | at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.1.jar!/:5.3.1]
spring_boot_app_1 | at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:156) ~[spring-data-commons-2.4.1.jar!/:2.4.1]
spring_boot_app_1 | at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:131) ~[spring-data-commons-2.4.1.jar!/:2.4.1]
spring_boot_app_1 | at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.1.jar!/:5.3.1]
spring_boot_app_1 | at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:80) ~[spring-data-commons-2.4.1.jar!/:2.4.1]
spring_boot_app_1 | at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.1.jar!/:5.3.1]
spring_boot_app_1 | at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-5.3.1.jar!/:5.3.1]
spring_boot_app_1 | at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.1.jar!/:5.3.1]
spring_boot_app_1 | at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) ~[spring-aop-5.3.1.jar!/:5.3.1]
spring_boot_app_1 | at com.sun.proxy.$Proxy88.findAll(Unknown Source) ~[na:na]
spring_boot_app_1 | at com.example.cassandra.springbootcassandrademo.controller.ProductController.getProducts(ProductController.java:43) ~[classes!/:0.0.1-SNAPSHOT]
spring_boot_app_1 | at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
spring_boot_app_1 | at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
spring_boot_app_1 | at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
spring_boot_app_1 | at java.base/java.lang.reflect.Method.invoke(Method.java:567) ~[na:na]
spring_boot_app_1 | at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.1.jar!/:5.3.1]
spring_boot_app_1 | at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.1.jar!/:5.3.1]
spring_boot_app_1 | at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.1.jar!/:5.3.1]
spring_boot_app_1 | at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:893) ~[spring-webmvc-5.3.1.jar!/:5.3.1]
spring_boot_app_1 | at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:807) ~[spring-webmvc-5.3.1.jar!/:5.3.1]
spring_boot_app_1 | at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.1.jar!/:5.3.1]
spring_boot_app_1 | at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.1.jar!/:5.3.1]
spring_boot_app_1 | at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.1.jar!/:5.3.1]
spring_boot_app_1 | at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.1.jar!/:5.3.1]
spring_boot_app_1 | at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.1.jar!/:5.3.1]
spring_boot_app_1 | at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.39.jar!/:4.0.FR]
spring_boot_app_1 | at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.1.jar!/:5.3.1]
spring_boot_app_1 | at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.39.jar!/:4.0.FR]
spring_boot_app_1 | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.39.jar!/:9.0.39]
spring_boot_app_1 | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.39.jar!/:9.0.39]
spring_boot_app_1 | at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.39.jar!/:9.0.39]
spring_boot_app_1 | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.39.jar!/:9.0.39]
spring_boot_app_1 | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.39.jar!/:9.0.39]
spring_boot_app_1 | at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.1.jar!/:5.3.1]
spring_boot_app_1 | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.1.jar!/:5.3.1]
spring_boot_app_1 | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.39.jar!/:9.0.39]
spring_boot_app_1 | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.39.jar!/:9.0.39]
spring_boot_app_1 | at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.1.jar!/:5.3.1]
spring_boot_app_1 | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.1.jar!/:5.3.1]
spring_boot_app_1 | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.39.jar!/:9.0.39]
spring_boot_app_1 | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.39.jar!/:9.0.39]
spring_boot_app_1 | at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.1.jar!/:5.3.1]
spring_boot_app_1 | at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.1.jar!/:5.3.1]
spring_boot_app_1 | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.39.jar!/:9.0.39]
spring_boot_app_1 | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.39.jar!/:9.0.39]
spring_boot_app_1 | at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.39.jar!/:9.0.39]
spring_boot_app_1 | at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.39.jar!/:9.0.39]
spring_boot_app_1 | at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.39.jar!/:9.0.39]
spring_boot_app_1 | at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.39.jar!/:9.0.39]
spring_boot_app_1 | at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.39.jar!/:9.0.39]
spring_boot_app_1 | at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.39.jar!/:9.0.39]
spring_boot_app_1 | at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.39.jar!/:9.0.39]
spring_boot_app_1 | at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.39.jar!/:9.0.39]
spring_boot_app_1 | at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.39.jar!/:9.0.39]
spring_boot_app_1 | at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) ~[tomcat-embed-core-9.0.39.jar!/:9.0.39]
spring_boot_app_1 | at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) ~[tomcat-embed-core-9.0.39.jar!/:9.0.39]
spring_boot_app_1 | at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.39.jar!/:9.0.39]
spring_boot_app_1 | at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
spring_boot_app_1 | at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
spring_boot_app_1 | at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.39.jar!/:9.0.39]
spring_boot_app_1 | at java.base/java.lang.Thread.run(Thread.java:830) ~[na:na]
Upvotes: 2
Views: 6020
Reputation: 1
It really helped me to making names of tables that i created with cql and created on the entity class. Here is my entity
@Getter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = {"id"})
@ToString
@Table("emp2")
public class Account implements Serializable {
@PrimaryKey
private String id = UUID.randomUUID().toString();
@Setter
@Column(value = "uname")
private String username;
@Setter
@Column(value = "name")
private String name;
.....
and here is my cql query
CREATE TABLE emp2(
id text PRIMARY KEY,
name text,
surname text,
email varint,
birthDate date,
password text,
createdAt date,
active boolean
);
Upvotes: 0
Reputation: 21
The @Table("table_name") need to be the same name at the schema. Try to write @Table("Product").
Please, check the import : org.springframework.data.cassandra.core.mapping.Table;
Upvotes: 1