【发布时间】:2017-06-12 09:06:05
【问题描述】:
更新(2017 年 1 月 31 日)所有示例代码都可用代码可在此处获得: C Y Kan's Mastering Cassandra Tutorial Video with free sample code。我尝试使用 skk 的示例代码来增强第 54 章,但没有帮助。下面的pom其实来自第52章(我猜CY在复制pom.xml时忘记更改名称标签)。
无论我做什么,我都会收到以下错误之一,具体取决于我为 Cassandra-Driver-Core 指定的版本(或者如果我指定了版本)。
按照 skk 的建议,我已经尝试过 spring boot 1.4.4 和其他版本。
我已经确认我确实在 Cassandra 中定义了一个键空间“cwt”和人员。您还需要什么详细信息?
好的,这是我尝试根据 skk 的建议来增强 CY Kan 的源代码。这会导致以下关于无法创建 bean 会话的错误。如果我明确指定 3.1.2 Cassandra 驱动程序核心,它会成功连接,但会出现 noSuchMethod 错误。与第 52 章错误(如下)相比,noSuchMethod 错误发生在第 54 章的 Cassandra Mapping bean 中。
package com.cassandrawebtrader.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.cassandra.config.CassandraClusterFactoryBean;
import org.springframework.data.cassandra.config.java.AbstractCassandraConfiguration;
import org.springframework.data.cassandra.mapping.BasicCassandraMappingContext;
import org.springframework.data.cassandra.mapping.CassandraMappingContext;
import org.springframework.data.cassandra.repository.config.EnableCassandraRepositories;
@Configuration
@EnableCassandraRepositories(basePackages="com.cassandrawebtrader")
public class CassandraConfig extends AbstractCassandraConfiguration {
@Override
protected String getKeyspaceName() {
// TODO Auto-generated method stub
return "cwt";
}
/*
@Bean
public CassandraClusterFactoryBean cluster() {
CassandraClusterFactoryBean cluster = new CassandraClusterFactoryBean();
cluster.setContactPoints("127.0.0.1");
cluster.setPort(9042);
return cluster;
}
*/
@Bean
public CassandraMappingContext cassandraMapping() {
return new BasicCassandraMappingContext();
}
// begin paste from http://stackoverflow.com/questions/41881168/wanted-help-making-springboot-cassandratemplate-example-work/41910388#41910388
String cassandraContactPoints = "127.0.0.1";
String cassandraPort = "9042";
@Bean
public CassandraClusterFactoryBean cluster() {
CassandraClusterFactoryBean cluster = new CassandraClusterFactoryBean();
cluster.setContactPoints(cassandraContactPoints);
cluster.setPort(Integer.parseInt(cassandraPort));
return cluster;
}
@Bean
public CassandraMappingContext mappingContext() {
return new BasicCassandraMappingContext();
}
@Bean
public org.springframework.data.cassandra.convert.CassandraConverter converter() {
return new org.springframework.data.cassandra.convert.MappingCassandraConverter(mappingContext());
}
@Bean
public org.springframework.data.cassandra.config.CassandraSessionFactoryBean session() throws Exception {
org.springframework.data.cassandra.config.CassandraSessionFactoryBean session = new org.springframework.data.cassandra.config.CassandraSessionFactoryBean();
session.setCluster(cluster().getObject());
session.setKeyspaceName(getKeyspaceName());
session.setConverter(converter());
session.setSchemaAction(org.springframework.data.cassandra.config.SchemaAction.NONE);
return session;
}
/*
@Bean
public org.springframework.data.cassandra.core.CassandraOperations cassandraTemplate() throws Exception {
return new org.springframework.data.cassandra.core.CassandraTemplate(session().getObject());
}
*/
// end paste from http://stackoverflow.com/questions/41881168/wanted-help-making-springboot-cassandratemplate-example-work/41910388#41910388
}
您还想要什么其他细节?
更新(2017 年 1 月 30 日):skk,请发布您的 java 驱动程序代码。
按照skk的建议,我已经尝试了建议的版本号并尝试了建议的bean。
我仍然收到类似的错误:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cassandraMapping' defined in class path resource [com/cassandrawebtrader/config/CassandraConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.mapping.CassandraMappingContext]: Factory method 'cassandraMapping' threw exception; nested exception is java.lang.NoSuchMethodError: com.datastax.driver.core.DataType.asJavaClass()Ljava/lang/Class;
谢谢
早期更新:按照建议,我尝试删除 Cassandra 组件的版本号,只为 spring-boot-starter-parent 指定 1.4.3.RELEASE 并且收到此错误:
在类路径资源 [org/springframework/boot/autoconfigure/data/cassandra/CassandraDataAutoConfiguration.class] 中创建名称为“session”的 bean 时出错:调用 init 方法失败;嵌套异常是 com.datastax.driver.core.exceptions.NoHostAvailableException:所有主机尝试查询失败(尝试:localhost/127.0.0.1:9042(com.datastax.driver.core.exceptions.InvalidQueryException:未配置的表 schema_keyspaces ))
所以现在它甚至没有连接(在连接之前)。
原文: 经过数小时的谷歌搜索并没有找到任何有效的 java/spring-boot/cassandra 示例,我终于从这里的视频中找到了第 52 章中的 CQLTemplate 示例:[PacktPub C Y Kan's Mastering Cassandra 2nd Ed] 有效。 1。这行得通! (但是,我需要使用 CassandraTemplate 而不是 CQLTemplate)。
这意味着我的 Cassandra 3.9 在 Windows 10 和 java 1.8 上正常运行 - 你同意吗?
下一个示例(本教程的第 53 章)使用 CassandraTemplate,我收到此错误:
java.lang.NoSuchMethodError: com.datastax.driver.core.DataType.asJavaClass()Ljava/lang/Class;
我从第 52 章中发现,我必须将 com.datastax.cassandra/cassandra-driver-core 的版本从 2.1.6 更改为 3.0.0。我一直在尝试更改 com.datastax.cassandra/assandra-driver-mapping 的版本,但到目前为止没有运气。这是我从 PacktPub 下载的稍作修改的 pom.xml(如下)。有人可以帮我完成这项工作或建议另一个可行的 CassandraTemplate 示例(将 POJO 映射到 Cassandra 数据库)吗?
非常感谢! 齐格飞
<?xml version="1.0" encoding="UTF-8"?>
http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0
<groupId>com.cassandrawebtrader</groupId>
<artifactId>chapter51</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>chapter51</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<!--<version>1.2.5.RELEASE</version> -->
<version>1.2.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-cassandra</artifactId>
</dependency>
<dependency>
<groupId>com.datastax.cassandra</groupId>
<artifactId>cassandra-driver-core</artifactId>
<version>3.0.0</version> <!-- 2.1.6 -->
</dependency>
<dependency>
<groupId>com.datastax.cassandra</groupId>
<artifactId>cassandra-driver-mapping</artifactId>
<version>3.0.0</version> <!-- 2.1.6 -->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
【问题讨论】:
-
您使用旧版本的 spring-boot 有什么原因吗?当前版本是 1.4.3.RELEASE。那么您不必担心将 cassandra-driver 版本设置为默认版本,上述版本可能会实现此方法调用。
-
这不起作用,因为我得到了一个不同的错误。
-
在某些情况下,不同的错误实际上可能意味着进步。也许您应该编辑您的帖子并添加上述错误。还是上面的 NoHostAvailableException?
-
似乎 Cassandra 3.x 支持仅由尚未发布的 spring-boot 1.5.x 提供(请参阅 (stackoverflow.com/questions/40481948/…)。您可能需要降级您的 cassandra 服务器才能使用 spring -boot-1.4.3.RELEASE。我个人发现 spring-data-cassandra 在我的项目中过于局限,我编写了自己的 CrudRepository 实现。
-
@anand1st Spring Data Cassandra 1.5(支持 Cassandra 3)于昨天发布,预计今天发布 Spring Boot 1.5。
标签: java spring spring-boot cassandra spring-data-cassandra