2016-10-25 3 views
6

Я хочу использовать Cassandra 3.x в проекте Spring Boot. Я узнал, что версия текущей версии Spring Data Cassandra поддерживает только Cassandra 2.x. Поэтому я хотел использовать драйвер DataStax вместо проекта Spring Data Cassandra. Я добавилSpring Boot 1.4.1 и Cassandra 3.x

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 года и не поддерживающая Cassandra 3. Используя этот драйвер, все работает, но я не хотите использовать старый драйвер.

UPDATE: Я удалил зависимость драйвера DataStax и попытался использовать версию Spring Data Cassandra версии 1.5.0.M1 и переопределить версии драйвера Spring, Spring Data Cassandra и Cassandra в buildscript.

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 Driver, я получаю тот же NoClassDefFoundError, что и раньше. Добавление Нетти как зависимость снова убивает мои модульные тесты на основе TestRestTemplate ...

UPDATE: TestRestTemplate не работает, потому что Spring Загрузочный настраивает его использовать Netty4ClientHttpRequestFactory, когда он находит Нетти на пути к классам и Netty4ClientHttpRequestFactory не похож на работу ,

См https://github.com/spring-projects/spring-boot/issues/7240 и https://jira.spring.io/browse/SPR-14860

Для исправления см моего ответа на этот вопрос.

+2

Предстоящий релиз Spring Data Cassandra 1.5 будет поддерживать Cassandra 3.x (см https://spring.io/blog/2016/07/27/spring-data-release-train-ingalls-m1-released и https://stackoverflow.com/questions/40020828/missing-artifact-spring-data-cassandra-1-5-0m1). Драйверу Datastax '3.1.1 требуется нетто 4.0.37.Final. – mp911de

ответ

4

Я придерживаюсь использования 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 функциональность драйвера работу, которую я должен был добавить Нетти как зависимость.

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); 
    } 
} 
+0

Проблема появляется в restTemplate.exchange (...), а также в весенней версии загрузки 1.5.1 ... спасибо за сообщение вопроса и ответа. – Hasson