InvalidQueryException: несконфигурированная таблица

Я новичок в Cassandra и пытался настроить проект springboot (версия 2.4.0), подключающийся к cassandra (spring cassandra 3.1.1), используя докер. Ниже мой код:

Класс конфигурации:

@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"};
    }
}

Репозиторий:

public interface ProductRepository extends CassandraRepository<Product, Integer> {
}

Стол:

@Table("product")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Product {

    @PrimaryKey
    private int id;
    private String name;
}

приложение.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

version: "2"
services:
  spring_boot_app:
    build: .
    ports:
      - "8080:8080"
  cassandradb:
    image: cassandra
    container_name: cassandradb
    ports:
    - "9042:9042"

Когда запускаются как приложение spring, так и контейнеры cassandra, я создаю приведенную ниже таблицу в пространстве ключей mykeyspace.

 use mykeyspace;
 CREATE TABLE Product(id int PRIMARY KEY, name TEXT);

Когда я нажимаю конечную точку отдыха (get) через свой контроллер, я получаю сообщение об ошибке:

com.datastax.oss.driver.api.core.servererrors.InvalidQueryException: unconfigured table product

Я проверил этот пост, где в принятом ответе говорится о создании таблицы в определенном пространстве ключей (что я уже делаю): com.datastax.driver.core.exceptions.InvalidQueryException: ненастроенный пользователь таблицы

Кто-нибудь может мне помочь?

Спасибо!

Полная трассировка стека:

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]

person user1318369    schedule 27.11.2020    source источник
comment
Может ли кто-нибудь помочь с проблемой ниже? Пожалуйста помоги!   -  person user1318369    schedule 17.12.2020
comment
Итак, когда вы запускаете cqlsh в кластер, существуют ли пространство ключей и таблица?   -  person Aaron    schedule 17.12.2020
comment
Да, таблица создана, и я могу запросить ее с помощью cqlsh, но она не работает, когда я вызываю ее из весенней точки покоя.   -  person user1318369    schedule 19.12.2020


Ответы (1)


@Table(table_name) должно быть тем же именем в схеме. Попробуйте написать @Table(Product).

Пожалуйста, проверьте импорт: org.springframework.data.cassandra.core.mapping.Table;

person Luciana Oliveira    schedule 08.02.2021