簡體   English   中英

Spring Boot 1.4.1和Cassandra 3.x

[英]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/7240https://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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM