Я хочу использовать 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 а>
Чтобы исправить это, см. Мой ответ на этот вопрос.