user1318369
user1318369

Reputation: 715

InvalidQueryException: unconfigured table

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

Answers (2)

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

Luciana Oliveira
Luciana Oliveira

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

Related Questions