设置 bean 属性“cassandraTemplate”时无法解析对 bean“cassandraTemplate”的引用

问题描述 投票:0回答:1

我正在使用 spring boot 连接到 Cassandra 数据库。我在启动时收到错误消息

Error creating bean with name 'abcItemsRepository' defined in com.myspace.mycompany.repository defined in @EnableCassandraRepositories declared on CassandraRepositoriesRegistrar.EnableCassandraRepositoriesConfiguration: Cannot resolve reference to bean 'cassandraTemplate' while setting bean property 'cassandraTemplate'

请帮我修复它。 以下是我的配置和存储库:

@Table("abc_items")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class OboItems {

  @Id
  @PrimaryKeyColumn(name = "item_id", ordinal = 0, type = PrimaryKeyType.PARTITIONED)
  @Column(name = "item_id")
  private String itemId;

  @Column(name = "last_scheduled_time")
  private Date lastScheduledTime;

}

@SpringBootApplication
public class MyApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }

}


public interface OboItemsRepository extends CassandraRepository<OboItems,String> {

}


spring.data.cassandra.contact-points=<my-end-point>
spring.data.cassandra.port=9042
spring.data.cassandra.username=<username>
spring.data.cassandra.password=<password>
spring.data.cassandra.keyspace-name=<mykeyspace>
spring.data.cassandra.session.timeout=30000

我尝试配置从 AbstractCassandraConfiguration 扩展的 CassandraConfig。但我没有运气。 我期望应用程序成功启动并能够以 JPA 风格运行 cassandra 查询。

spring-boot spring-data-cassandra
1个回答
0
投票

除了 application.properties 文件中的配置之外,我还能够使用以下配置来修复它。

@Configuration
@PropertySource(value = { "classpath:application.properties" })
@EnableCassandraRepositories(basePackages = "com.walmartlabs.cia.MatchReconciler.cassandra")
public class CassandraConfig extends AbstractCassandraConfiguration {

  @Value("${spring.data.cassandra.keyspace-name}")
  private String keySpace;

  @Value("${spring.data.cassandra.contact-points}")
  private String contactPoints;

  @Value("${spring.data.cassandra.dc}")
  private String datacenter;
  @Value("${spring.data.cassandra.port}")
  private int port;
  @Value("${spring.data.cassandra.username}")
  private String username;

  @Value("${spring.data.cassandra.password}")
  private String password;
  @Value("${spring.data.cassandra.keyspace-name}")
  private String keyspaceName;

  @Override
  protected String getContactPoints() {
    return contactPoints;
  }
  @Override
  protected String getKeyspaceName() {
    return keySpace;
  }


  @Override
  protected int getPort() {
    return port;
  }

  @Override
  protected String getLocalDataCenter() {
    return datacenter;  // Adjust as per your setup
  }

  @Bean
  @Override
  public CqlSessionFactoryBean cassandraSession() {
    CqlSessionFactoryBean cassandraSession = super.cassandraSession();//super session should be called only once
    cassandraSession.setUsername(username);
    cassandraSession.setPassword(password);
    cassandraSession.setContactPoints(contactPoints);
    cassandraSession.setPort(port);
    cassandraSession.setLocalDatacenter(datacenter);
    cassandraSession.setKeyspaceName(keySpace);
    return cassandraSession;
  }

  @Override
  protected SessionBuilderConfigurer getSessionBuilderConfigurer() {
    return new SessionBuilderConfigurer() {

      @Override
      public CqlSessionBuilder configure(CqlSessionBuilder cqlSessionBuilder) {
        log.info("Configuring CqlSession Builder");
        return cqlSessionBuilder
                .withConfigLoader(DriverConfigLoader.programmaticBuilder()
                // Resolves the timeout query 'SELECT * FROM system_schema.tables' timed out after PT2S
                .withDuration(DefaultDriverOption.METADATA_SCHEMA_REQUEST_TIMEOUT, Duration.ofMillis(60000))
                .withDuration(DefaultDriverOption.CONNECTION_INIT_QUERY_TIMEOUT, Duration.ofMillis(60000))
                .withDuration(DefaultDriverOption.REQUEST_TIMEOUT, Duration.ofMillis(15000))
                .build());
      }
    };
  }
© www.soinside.com 2019 - 2024. All rights reserved.