Spring Boot 1.4.1 и Cassandra 3.x

Я хочу использовать Cassandra 3.x в проекте Spring Boot. Я обнаружил, что текущая версия проекта 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(...)

or

TestRestTemplate.put(...)

потерпеть поражение. Но используя

TestRestTemplate.getForObject(...)

работает как положено. Я предполагаю, что есть некоторое противоречие в зависимостях Spring Boot и версии Netty, которую я добавил в качестве зависимости.

Я обнаружил, что последняя версия драйвера DataStax Cassandra для работы без дополнительной зависимости Netty - это 2.1.5, датированная мартом 2015 года и не поддерживающая Cassandra 3. С помощью этого драйвера все работает, но я не хочу использовать драйвер тот старый.

ОБНОВЛЕНИЕ: я удалил зависимость драйвера DataStax и попытался использовать версию Spring Data Cassandra 1.5.0.M1 и переопределить версии драйверов 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

Чтобы исправить это, см. Мой ответ на этот вопрос.


person Emanuel Seidinger    schedule 25.10.2016    source источник
comment
Предстоящий выпуск Spring Data Cassandra 1.5 будет поддерживать Cassandra 3.x (см. spring.io/blog/2016/07/27/ и stackoverflow.com/questions/40020828/). Драйвер Datastax '3.1.1 требует netty 4.0.37.Final.   -  person mp911de    schedule 25.10.2016


Ответы (1)


Я использую 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);
    }
}
person Emanuel Seidinger    schedule 26.10.2016
comment
Проблема также появляется в restTemplate.exchange (...), все еще в версии 1.5.1 весенней загрузки ... спасибо за вопрос и ответ. - person Hasson; 27.02.2017