私の spring-boot/spring-data-cassandra アプリケーションは Cassandra 2.1 で問題なく動作していましたが、Cassandra を 3.3 にアップグレードすると、Cassandra サーバーに接続できなくなりました。そのため、pom ファイルでは、特定の spring-data-cassandra モジュール (1.3.2.RELEASE) を使用することにしました。spring-data-cassandra モジュールの新しいバージョンが最新の Cassandra Java ドライバーを使用することを期待していました。新しい spring-data-cassandra モジュールは新しいバージョン (2.1.5) の cassandra ドライバーを使用していますが、アプリケーションを実行すると奇妙な例外が発生しました。
[...CassandraConfig.class]; ネストされた例外は java.lang.annotation.AnnotationFormatError: Invalid default: public abstract java.lang.Class org.springframework.data.cassandra.repository.config.EnableCassandraRepositories.repositoryBaseClass() です
この例外が発生する理由を知っている人はいますか? コードは Cassandra 2.1/spring-data-cassandra 1.1.3 で正常に動作しました。
spring-data-cassandra は Cassandra 3.3.0 をサポートしていますか?
CassandraConfig クラスのソース コードは次のとおりです。
@Configuration
@PropertySource(value={"classpath:/device/repo/cassandra.properties"})
@EnableCassandraRepositories("device.repo")
public class CassandraConfig {
@Autowired
private Environment env;
@Bean
public CassandraClusterFactoryBean cluster() {
CassandraClusterFactoryBean cluster = new CassandraClusterFactoryBean();
cluster.setContactPoints(getContactPoints());
cluster.setPort(getPort());
return cluster;
}
@Bean
public CassandraMappingContext mappingContext() {
return new BasicCassandraMappingContext();
}
@Bean
public CassandraConverter converter() {
return new MappingCassandraConverter(mappingContext());
}
@Bean
public CassandraSessionFactoryBean session() throws Exception {
CassandraSessionFactoryBean session = new CassandraSessionFactoryBean();
session.setCluster(cluster().getObject());
session.setKeyspaceName(getKeyspaceName());
session.setConverter(converter());
session.setSchemaAction(SchemaAction.NONE);
return session;
}
@Bean
public CassandraOperations cassandraTemplate() throws Exception {
return new CassandraTemplate(session().getObject());
}
protected String getKeyspaceName() {
return env.getProperty("cassandra.keyspace");
}
protected String getContactPoints() {
return env.getProperty("cassandra.contactpoints");
}
protected int getPort() {
return Integer.parseInt(env.getProperty("cassandra.port"));
}
}
本当にありがとう!