[英]Spring Boot 1.4.1 and Cassandra 3.x
我想在Spring Boot項目中使用Cassandra 3.x. 我發現當前發布的Spring Data Cassandra項目版本僅支持Cassandra 2.x. 所以我想使用DataStax驅動程序而不是Spring Data Cassandra項目。 我補充道
compile 'com.datastax.cassandra:cassandra-driver-core:3.1.1'
作為依賴。 現在我可以將值插入到Cassandra集群的鍵空間中。 但是當運行REST控制器的測試時,我得到一個錯誤
java.lang.NoClassDefFoundError: io/netty/handler/codec/http/FullHttpRequest
所以我補充道
compile 'io.netty:netty-all:4.1.6.Final'
作為依賴,錯誤消失了。 但現在所有測試都使用
TestRestTemplate.postForObject(...)
要么
TestRestTemplate.put(...)
失敗。 但是使用
TestRestTemplate.getForObject(...)
按預期工作。 我假設在Spring Boot的依賴項和我作為依賴項添加的Netty版本中存在一些沖突。
我發現最新版本的DataStax Cassandra驅動程序在沒有額外的Netty依賴性的情況下工作是2.1.5,其日期為2015年3月,並且不支持Cassandra 3.使用此驅動程序一切正常但我不想使用那個老司機。
更新:我刪除了DataStax驅動程序依賴項,並嘗試使用Spring Data Cassandra的1.5.0.M1版本,並在buildscript中覆蓋Spring,Spring Data Cassandra和Cassandra驅動程序版本。
ext['spring.version'] = '5.0.0.M2'
ext['spring-data-releasetrain.version'] = 'Ingalls-M1'
ext['cassandra-driver.version'] = '3.1.1'
這導致以下錯誤:
java.lang.NoClassDefFoundError: io/netty/util/Timer
使用Cassandra功能時。 當我再次包含Netty時,Cassandra功能正常,但我使用TestRestTemplate.put
和.post
測試不再運行了。 我再次嘗試升級到Spring Boot Version 2.0.0.BUILD-SNAPSHOT,其中還包括Spring Data Cassandra 1.5.0.M1。 現在,當我啟動應用程序並使用DataStax驅動程序功能時,我得到與以前相同的NoClassDefFoundError。 將Netty添加為依賴項會再次導致基於TestRestTemplate的單元測試...
更新: TestRestTemplate
無法正常工作,因為Spring Boot將它配置為使用Netty4ClientHttpRequestFactory
當它在類路徑上找到Netty並且Netty4ClientHttpRequestFactory
似乎不起作用時。
請參閱https://github.com/spring-projects/spring-boot/issues/7240和https://jira.spring.io/browse/SPR-14860
有關修復,請參閱我對此問題的回答。
我堅持使用Spring Data Cassandra 1.5.0.M1和Cassandra驅動程序3.1.1使用以下版本覆蓋:
ext['spring.version'] = '5.0.0.M2'
ext['spring-data-releasetrain.version'] = 'Ingalls-M1'
ext['cassandra-driver.version'] = '3.1.1'
為了使Cassandra驅動程序功能正常工作,我不得不將Netty添加為依賴項。
compile 'io.netty:netty-all:4.1.6.Final'
要TestRestTemplate.postForObject(...)
和TestRestTemplate.put(...)
我必須提供RestTemplateBuilder
@Bean
並將其配置為使用SimpleClientHttpRequestFactory
。
@TestConfiguration
static class TestConfig {
@Bean
public RestTemplateBuilder restTemplateBuilder() {
return new RestTemplateBuilder().detectRequestFactory(false).requestFactory(SimpleClientHttpRequestFactory.class);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.